Laravel隐式模型绑定省略参数

时间:2017-01-05 19:41:14

标签: laravel laravel-5 laravel-5.3

我在Laravel 5.3.26中使用隐式模型绑定来处理这样的路由

POST /teams/{team}/customers/{customer}/addresses

在中间件中使用{team}来确定用户当前正在使用哪个团队。但是地址的存储方法只需注入{customer};它不会以任何方式访问团队。所以方法的标题可能如下所示:

public function store(Customer $customer, Request $request)

不幸的是,所选团队的ID会被注入$customer而不是实际的Customer实例。如果我将$team参数添加到store方法,那么函数头看起来像这样:

public function store(Team $team, Customer $customer, Request $request)

一切都按预期工作。有没有办法省略$team参数,但仍然可以在函数中注入正确的Customer实例?

1 个答案:

答案 0 :(得分:0)

我认为你应该为此做出不同的路线:

Route::put('customers', 'CustomerController@store')-name('customers.store');

然后你的表格:

<form action="{{ route('customers.store') }}' method="POST">
    {{ method_field('PUT') }}
    {{ csrf_field() }}
    //other stuff
</form>

或者,如果必须,您可以在路线中使用?来指示模型可能存在或不存在:

Route::post('/teams/{team?}/customers/{customer}/addresses', 'Controller@method');

然后在您的控制器方法中,您仍然需要定义$team,但它可能存在也可能不存在,例如:

public function store(Request $request, $team = null, Customer $customer)

旁注 Request应始终排在第一位。