Привязка модели маршрута в контроллере @ index? - PullRequest
1 голос
/ 07 июня 2019

Я хочу настроить маршрут, который выбирает все Contact 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

Я все еще могу получить доступ к идентификатору клиента внутри логики контроллера, используя Route::current()->parameters['customer'], но разве нет лучшего / более простого способа сделать это?

Ответы [ 2 ]

0 голосов
/ 07 июня 2019

Предоставление параметра {customer} методу index() контроллера было правильным решением.После публикации этого вопроса я наткнулся на термин контроллер вложенных ресурсов , который точно описывает то, что я хотел достичь.В справочном сообщении для команды php artisan make:controller я обнаружил, что флаг -p сделает это для меня.

Я создал новый контроллер с использованием php artisan make:controller --model=Contact --parent=Customer TestCustomerContactsController и обнаружил, что единственными изменениями в моем текущем контроллере были точные изменения Я уже вносил в свой существующий контроллер.

Встроенный экран отладки в Laravel представлял собой красную сельдь.Не имея $customer области действия метода, Laravel выдаст ошибку (как и должно быть).С правильно заданной областью действия, сообщение об ошибке исчезло, но с совершенно пустым холстом казалось, что я движусь не в том направлении.

Исправление

Мой view был заполнен@section с, но без @extends, сообщая, какой шаблон макета будет отображаться.Без предоставления этой директивы любой код в блоках @section не будет обработан, который в моем случае представлял собой весь вид, возвращая пустую страницу.

Ответ на другой вопрос

В случаеиз ответа * Developer @ 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;
}
0 голосов
/ 07 июня 2019

Если вы получаете значение из контроллера, попробуйте это

ваш маршрут

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

и

попробуйте это в вашем контроллере

public function testing(Request $req)
{
    dd($req->customer);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...