#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');
Это решило проблему. Спасибо за помощь тем, кто прокомментировал.