пользовательский маршрут Laravel не найден

#php #laravel-5 #routing

#php #laravel-5 #маршруты

Вопрос:

Я создал пользовательское действие контроллера для сохранения «второго уровня» моих объектов конфигурации, поскольку начальная форма сохраняет учетные данные, которые затем используются для извлечения доступных элементов из веб-службы.

Метод настройки второго уровня

ConfigurationController

 public function storeTest(Request $request)
{
    dd($request);
}
  

Маршрут был добавлен в файл web.php routes:

web.php

 // configuration routes
Route::resource('configurations', 'ConfigurationController');
Route::put('configurations/test/{$id}', 'ConfigurationController@storeTest')->name('configurations.test_update');
  

Вывод из php artisan route:list показывает маршрут правильно:

 | PUT | configurations/test/{$id} | configurations.test_update | AppHttpControllersConfigurationController@storeTest | web 
  

И, наконец, моя форма, использующая пакет LaravelCollective form:

 {!! Form::model($configuration, ['action' => ['ConfigurationController@storeTest', $configuration->id], 'method' => 'put']) !!}
  

Просмотр исходного кода на странице формы показывает, что действие выглядит правильно:

 <form method="POST" action="http://myapp.app/configurations/test/20010504142745046252000000" accept-charset="UTF-8"><input name="_method" type="hidden" value="PUT">
  

Но когда форма отправляется, она выдает ошибку, в которой говорится, что NotFoundHttpException in RouteCollection.php line 161

Комментарии:

1. Что вы получите, если измените 'action' => ['ConfigurationController@storeTest', $configuration->id] на 'route' => ['configurations.test_update', $configuration->id] ?

2. Также кажется, что вам не хватает вашего $id параметра в вашем методе контроллера. Попробуйте изменить его на: public function storeTest(Request $request, $id)

3. Что, если вы измените свою конфигурацию в web.php файл, поэтому put находится непосредственно перед ресурсом, поскольку ресурс может перехватывать его до того, как он попадет на маршрут put

Ответ №1:

Ошибка была действительно простой. В маршруте вам не нужно использовать знак доллара с переменной:

 Route::put('configurations/test/{$id}', 'ConfigurationController@storeTest')->name('configurations.test_update');
  

неверно. Он должен просто читать:

 Route::put('configurations/test/{id}', 'ConfigurationController@storeTest')->name('configurations.test_update');
  

Это решило проблему. Спасибо за помощь тем, кто прокомментировал.