在controller @ index中路由模型绑定?

时间:2019-06-07 04:34:23

标签: laravel route-model-binding

我想设置一条路由来提取与Contact关联的所有Customer。端点看起来像/customers/{customer}/contacts,因此{customer}提供了应返回联系人的上下文。我的routes/web.php看起来像这样:

Route::get('/customers/{customer}/contacts', 'CustomerContactsController@index');

我用指定的--model=Contact生成了控制器。结果,有几种方法带有开箱即用的类型提示,但是index()方法却没有,实际上不会在提供任何参数的情况下根本无法运行。

来自CustomerContactsController.php

public function index(Customer $customer)
{
    $this->authorize('update', $customer->account);

    $contacts = $customer->contacts;

    return view('contacts.index', compact('customer', 'contacts'));
}

这将返回一个完全空白的屏幕。关联的“刀片”视图如下所示:

@section('title')
{{ $customer->name }}
@endsection

@section('action')
    <a href="{{ $customer->path() . '/contacts/create' }}" class="button" >{{ __('Add New Contact') }}</a>
@endsection

@section('content')
<ul>
    @foreach ($contacts as $contact)   
        <li>{{ $contact->name }}</li> 
    @endforeach
</ul>
@endsection

我仍然可以使用Route::current()->parameters['customer']访问控制器逻辑中的客户ID,但是没有更好/更容易的方法吗?

2 个答案:

答案 0 :(得分:0)

如果您从控制器中获得价值,请尝试

您的路线是

Route::get('/customers/{customer}/contacts', 'CouponsController@testing');

在您的控制器中尝试

public function testing(Request $req)
{
    dd($req->customer);
}

答案 1 :(得分:0)

为控制器的{customer}方法提供index()参数是正确的方法。发布此问题后,我偶然发现了嵌套资源控制器一词,其中恰好描述了我想要完成的工作。在php artisan make:controller命令的帮助消息中,我发现-p标志将为我做到这一点。

我使用php artisan make:controller --model=Contact --parent=Customer TestCustomerContactsController创建了一个新的控制器,发现对我当前控制器的唯一更改是我已经对现有控制器进行了精确更改

Laravel中的内置调试屏幕是红色的鲱鱼。如果没有将$customer限制在该方法的范围内,Laravel会踢回一个错误(应有的错误)。正确设置变量的范围后,错误消息消失了,但是使用完全空白的画布,感觉就像我完全朝错误的方向前进。

修复

我的view充满了@section,但是没有@extends告诉它要渲染到哪个布局模板。如果不提供此指令,@section块中的任何代码都不会被渲染,在我的情况下,这是整个视图,并返回一个空页面。

回答另一个问题

如果@Developer的answer不清楚,则{parameter} URI中存在的任何Route也可以通过控制器中的request()->parameter获得。例如

// routes/web.php
Route::get('/customers/{customer}/contacts/{contact}', 'CustomerContactsController@show');

// CustomerContactsController.php
public method show()
{
    $customer_id = request()->customer;
    $contact_id = request()->contact;
}