2 回答

TA贡献2019条经验 获得超9个赞
在 Laravel 中可以做到这一点的一个好方法是使用Form Requests。您可以为您的请求创建一个扩展 FormRequest 类的类(假设您StorePost为此示例调用它)。
在这个类中,您可以使用该rules方法来放置您的验证规则,如下所示:
public function rules()
{
return [
'name_en' => 'required',
'name_de' => 'required',
];
}
要添加slug_密钥,您可以使用prepareForValidation 方法。该方法可用于通过该merge方法向请求中添加数据,例如:
protected function prepareForValidation()
{
$this->merge([
'slug_en' => Str::slug($this->name_en),
'slug_de' => Str::slug($this->name_de)
]);
}
因为这发生在验证之前,您甚至可以在方法中为您的slug_键添加验证。rules()
所以要实际使用这个类,你可以简单地使用 Laravel 魔法在你的控制器方法中输入类名。您真正整洁的控制器现在可以如下所示:
public function store(StorePost $request)
{
Post::create($request->all()); // or specify the keys you want inside the `all()` method
// ...
}
就这么简单!表单请求的验证实际上会在控制器方法运行之前发生,因此您可以确定验证的数据是正确的。
当然,您可以在表单请求类中添加您想要的任何方法,因此有许多不同的方法可以实现这一点,例如使用getPostData返回包含 slug 值的数组的方法。

TA贡献1836条经验 获得超4个赞
Laravel 有一个名为TransformsRequest的类;
它可以自动过滤和处理您请求中的每个字段。
我认为您可以创建一个类似的中间件SlugStrings.php并扩展 TransformsRequest。
所以每个请求的键值都会被slug.
创建app/Http/Middleware/SlugStrings.php文件:
namespace App\Http\Middleware;
use Illuminate\Foundation\Http\Middleware\TransformsRequest;
use Illuminate\Support\Str;
class SlugStrings extends TransformsRequest
{
/**
* The names of the attributes that should be slug.
*
* @var array
*/
protected $only = [
'name_en',
'name_de',
];
/**
* Transform the given value.
*
* @param string $key
* @param mixed $value
* @return mixed
*/
protected function transform($key, $value)
{
if (in_array($key, $this->only, true)) {
return is_string($value) ? Str::slug($value) : $value;
} else {
return $value;
}
}
}
将此中间件添加到app/Http/Kernel.php:
protected $middleware = [
\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
...
// Add it here:
\App\Http\Middleware\SlugStrings::class,
...
];
现在你不能对字段name_en和做任何事情name_de,只需从请求中创建它们:
public function store()
{
Post::create( request()->validate([
'name_en' => 'required',
'name_de' => 'required'
]) );
}
这很容易。
所以下次你有另一个领域时,你想打它。只需将其添加到$only属性中。
- 2 回答
- 0 关注
- 117 浏览
添加回答
举报