sorokin-fm / laravel-request-sanitizer
此包的最新版本(1.0)没有可用的许可信息。
Laravel 请求清理器
1.0
2019-01-07 01:27 UTC
Requires
- php: >=7.1
- elforastero/transliterate: ^1.1
- laravel/framework: 5.6.*
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',
];