sorokin-fm/laravel-request-sanitizer

此包的最新版本(1.0)没有可用的许可信息。

Laravel 请求清理器

1.0 2019-01-07 01:27 UTC

This package is not auto-updated.

Last update: 2024-09-25 09:53:22 UTC


README

我们都知道,控制器越薄越好。我们希望有这样的控制器

    public function update(UpdateRequest $request, $id)
    {
        /** @var SomeModel $model */
        $model = SomeModel::find($id);
        $model->fill($request->input());
        $model->save();

        return back()
            ->with('success', __('Some model has been changed'));
    }

不幸的是,有几个情况,我们无法直接将输入传递给填充

例如,有些字段是复选框。因此我们需要进行一些预处理

$values = $request->input();
$values['checkbox1'] = $values['checkbox1'] ? 1 : 0;
$values['checkbox2'] = $values['checkbox2'] ? 1 : 0;
$model->fill($values);

另一个场景是我们需要上传文件

$values = $request->input();

$file = $request->file('picture');
if ($file) {
    $filename = Transliteration::make(
        pathinfo($file->getClientOriginalName(), PATHINFO_FILENAME),
        ['type' => 'filename', 'lowercase' => true]);

    $filename .= '.' . $file->getClientOriginalExtension();

    $file->move($filePath, $filename);

    $values['picture'] = $filename;
}

$file = $request->file('thumb');
if ($file) {
    $filename = Transliteration::make(
        pathinfo($file->getClientOriginalName(), PATHINFO_FILENAME),
        ['type' => 'filename', 'lowercase' => true]);

    $filename .= '.' . $file->getClientOriginalExtension();

    $file->move($filePath, $filename);

    $values['thumb'] = $filename;
}

$model->fill($values);

正如你所见,它并不是很薄,对吧?而且最糟糕的是,我们需要在存储和更新操作中重复这段代码。那么我们能做些什么来让它变得更好呢?

为此 - 添加此包

compose require "sorokin-fm/laravel-request-sanitizer"

然后,将其添加到你的请求类中

use Illuminate\Foundation\Http\FormRequest;
use SorokinFM\RequestSanitizerTrait;

class StoreRequest extends FormRequest

    use RequestSanitizerTrait;
    const SANITIZE_RULES = [
        'enabled' => 'checkbox',
        'picture' => 'file:path/to/store',
    ];

    ...

现在你准备好使用了

    public function update(UpdateRequest $request, $id)
    {
        /** @var SomeModel $model */
        $model = SomeModel::find($id);
        $model->fill($request->sanitize());
        $model->save();

        return back()
            ->with('success', __('Some model has been changed'));
    }

当然,如果你想定义自己的清理器,你可以实现接口 SorokinFM\SanitizerInterface,然后指定完整类名(带命名空间)作为规则名称,例如

    use RequestSanitizerTrait;
    const SANITIZE_RULES = [
        'enabled' => 'checkbox',
        'picture' => 'file:path/to/store',
        'custom_data' => '\App\Sanitizers\CustomRequestSanitizer',
    ];

还有一点。你还可以在字段名称中使用通配符。在本地化时,当你不知道所有字段名称时,这会很有用

    use RequestSanitizerTrait;
    const SANITIZE_RULES = [
        'enabled' => 'checkbox',
        'picture:*' => 'file:path/to/store',
        'custom_data' => '\App\Sanitizers\CustomRequestSanitizer',
    ];