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 關注
- 109 瀏覽
添加回答
舉報