【问题标题】:Laravel: Access Model instance in Form Request when using Route/Model bindingLaravel:使用路由/模型绑定时在表单请求中访问模型实例
【发布时间】:2016-09-17 18:17:04
【问题描述】:

我在我的项目中为我的一个模型设置了一些路由/模型绑定,并且效果很好。我可以在我的路由路径中使用我的绑定,并接受我的模型实例作为我控制器中相关方法的参数。

现在我正在尝试使用这个模型做一些工作,所以我在我的控制器中创建了一个接受表单请求的方法,以便我可以进行一些验证。

public function edit(EditBrandRequest $request, Brand $brand)
{
    // ...

我的模型的每个不同实例都可以进行不同的验证,因此我需要能够使用模型的一个实例来构建一组自定义的验证规则。

有没有办法获取模型的实例,即从表单请求注入到控制器中?

我已经尝试在表单请求的构造函数中对模型实例进行类型提示

class EditBrandRequest extends Request
{
    public function __construct(Brand $brand)
    {
        dd($brand);
    }

我还尝试在表单请求的 rules() 方法中对模型实例进行类型提示。

class EditBrandRequest extends Request
{
    // ...

    public function rules(Brand $brand)
    {
        dd($brand);

在这两种情况下,我都提供了模型的空/新实例,而不是我期望的实例。

当然,我总是可以通过不打扰表单请求来解决这个问题,只需在控制器中生成规则并手动验证 - 但如果可能的话,我宁愿使用 Laravel 方式

谢谢

【问题讨论】:

    标签: php laravel laravel-5


    【解决方案1】:

    您可以使用绑定键简单地访问它,例如,如果您绑定Brand 模型:$router->model('brand', '\App\Brand'),您可以使用$this->brand 获取模型实例。以下是验证规则示例:

    'slug' => 'required|unique:brand,slug,' . $this->brand->id,
    

    编辑

    有时你可能有一个输入名称与绑定键使用相同的名称,例如,如果你将Address 模型绑定为address,那么你有一个输入字段address,这会使 Laravel 混淆。这种情况可以使用route()方法。

    'address' => 'required|unique:addresses,address,' . $this->route('address')->id,
    

    【讨论】:

    • 传奇 - 完美运行!就那么简单。谢谢!
    • 从第 4 版开始使用 Laravel,没想到这么简单——谢谢!
    • 能否请您详细说明 $router->model 函数的放置位置?
    • @Eamon 您可以将该行放入routes/*.php,但注册绑定的正确方法是在RouteServiceProvider.phpboot 方法中,例如Route::model('user', App\User::class)Route::bind('username', function ($username) { return User::where('username', '=', $username)->firstOrFail(); }); - 请参阅: laravel.com/docs/5.6/routing#route-model-binding
    • 如何使这种方法在单元测试模式下工作?
    猜你喜欢
    • 2020-05-27
    • 2021-05-24
    • 2016-06-04
    • 2017-06-22
    • 2018-12-17
    • 2019-06-06
    • 1970-01-01
    • 2019-09-05
    • 2017-07-06
    相关资源
    最近更新 更多