1

我想设置一个获取Contact与 a 关联的所有 s的路由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'));
}

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

@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

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

4

2 回答 2

1

{customer}为控制器的方法提供参数index()是正确的方法。在发布这个问题后,我偶然发现了嵌套资源控制器这个术语,它准确地描述了我想要完成的事情。在php artisan make:controller命令的帮助消息中,我发现该-p标志会为我执行此操作。

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

Laravel 内置的调试屏幕是一条红鲱鱼。在没有$customer限定方法的情况下,Laravel 会返回一个错误(应该如此)。正确定义变量范围后,错误消息消失了,但是在完全空白的画布上,感觉就像我完全走错了方向。

修复

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

回答另一个问题

如果@Developer 的回答{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;
}
于 2019-06-07T14:50:46.657 回答
0

如果你从控制器中获得价值,试试这个

你的路线是

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

在你的控制器中试试这个

public function testing(Request $req)
{
    dd($req->customer);
}
于 2019-06-07T04:51:25.830 回答