Laravel 说“路线未定义”

我有:

Route::patch('/preferences/{id}', 'UserController@update');

在这个视图文件(account/ferences ences.blade.php)中,我有:

{!! Form::model(Auth::user(), ['method' => 'PATCH', 'route' => '/preferences/' . Auth::user()->id]) !!}

但我得到了这个错误:

路由[/偏好/1]未定义

在直接调用 route()助手时也会发生类似的错误:

route('/preferences/' . Auth::user()->id');

我认为我对这个主题的文档有些误解,但是我已经用给定的参数为 PATCH 请求定义了一个路由,并在视图中正确地设置了这个路由。我忽略了什么?

258717 次浏览

在打开表单时执行 ['route' => 'someroute']时调用的 route()方法需要所谓的 命名路线。你给一条路线起了这样一个名字:

Route::patch('/preferences/{id}',[
'as' => 'user.preferences.update',
'uses' => 'UserController@update'
]);

也就是说,将路由的第二个参数放入一个数组,在该数组中既指定路由名称(as) ,也指定路由命中时的操作(uses)。

然后,当你打开表单时,你调用路线:

{!! Form::model(Auth::user(), [
'method' => 'PATCH',
'route' => ['user.preferences.update', Auth::user()->id]
]) !!}

现在,对于没有参数的路由,您可以只执行 'route' => 'routename',但是因为您有一个参数,所以您可以创建一个数组,并按顺序提供参数。

总而言之,由于你似乎正在更新当前用户的首选项,我建议你让处理控制器检查当前登录用户的 id,并基于此进行更新——没有必要在 URL 和路由中发送 id,除非你的用户也需要更新其他用户的首选项。:)

顺便说一句:

我有类似的问题,很多时候我得到的错误操作方法没有找到,但显然它是定义在控制器。

问题不在于控制器,而在于如何设置 outoutes.php 文件

假设在 route.php 文件中将 Controller 类设置为一个资源

Route::resource('example', 'ExampleController');

那么“/example”将在这里列出所有 RESTful Resource: Http://laravel.com/docs/5.0/controllers#restful-resource-controllers

但是现在您需要一些格式的定义,例如: ‘ action’= > ‘ ExampleController@postStore’,然后您必须将这个路由(在 route.php 文件中)更改为:

Route::controller('example', 'ExampleController');

这个线程是旧的,但是是第一个出现的,所以我想我也分享我的解决方案。除了在 routes.php文件中有命名路由之外。当您的路由文件中有重复的 URL 时,也可能发生此错误,但如果使用不同的名称,则此错误在此场景中可能会产生误导。例如:

Route::any('official/form/reject-form', 'FormStatus@rejectForm')
->name('reject-form');


Route::any('official/form/accept-form', 'FormStatus@acceptForm')
->name('accept-form');

更改其中一个名称可以解决这个问题。复制、粘贴和疲劳会导致这个问题:)。

对我来说,解决办法很简单:

我已经在 route.php文件的最开始定义了路由。

将命名路线移到底部后,我的应用程序终于看到了它。 这意味着路线被定义得太早了。

我最近也遇到了同样的问题,并且找到了解决办法。

你应该检查你的路线是否在一个路线组内

比如这里:

Route::group(['prefix' => 'Auth', 'as' => 'Auth.', 'namespace' => 'Auth', 'middleware' => 'Auth']

如果是这样,你应该在视图文件中使用它。像这样:

!! Form::model(Auth::user(), ['method' => 'PATCH', 'route' => 'Auth.preferences/' . Auth::user()->id]) !!}

如果没有定义路由,那么检查 web.php 路由文件。

Route::get('/map', 'NavigationController@map')->name('map'); // note the name() method.

然后您可以在视图中使用这个方法:

<a class="nav-link" href="\{\{ route('map') }}">\{\{ __('Map') }}</a>

PS: the _ _ (‘ Map’)是将“ Map”翻译成当前语言。

以及你可以通过工匠命令看到的路线的名称列表:

php artisan route:list

我的情况有点不同,因为它不是一个表单,而是返回一个视图。

MyView.blade.php是这样的:

<a href="\{\{route('admin')}}">CATEGORIES</a>

web.php路由文件定义如下:

Route::view('admin', 'admin.index')->name('admin');

我使用 Laravel 5.7并尝试了以上所有的答案,但似乎没有什么正中要害。

对我来说,删除 Laravel 创建的缓存文件非常简单。
似乎我的更改没有被反映出来,因此我的应用程序看不到路由。

有点夸张,但我决定使用以下命令同时重置所有缓存:

php artisan route:clear
php artisan view:clear
php artisan cache:clear

这里的主要命令是第一个命令,它将删除 bootstrap/cache/routes.php文件。
第二个命令将删除存储在 storage/framework/cache文件夹中的视图的缓存文件。
最后,最后一个命令将清除应用程序缓存。

请注意

php artisan route:list

或者得到更多的过滤下来的列表

php artisan route:list | grep your_route|your_controller

第四列告诉您注册的路由的名称(通常由 Route: : resource 生成)

执行命令时

php artisan route:list

您将看到所有已注册的路由都是表格格式的。 在这里您可以看到许多列,比如 Method、 URI、 Name、 Action 等等。

所以基本上如果你使用 路线()方法,这意味着它将只接受 姓名列的值,如果你想使用 URI列的值,你应该使用幼鱼的 Url ()方法。

还有一个原因:

如果 使用相同的 URI 覆盖路由(不知情) ,它会导致以下错误:

例如:

Route::get('dashboard', ['uses' => 'SomeController@index', 'as' => 'my.dashboard']);
Route::get('dashboard/', ['uses' => 'SomeController@dashboard', 'as' => 'my.home_dashboard']);

在这种情况下,路由‘ my.dashboard’是无效的,因为两个路由具有相同的 URI (‘ dashboard’,‘ dashboard/’)

解决方案: 您应该更改其中任何一个的 URI

例如:

Route::get('dashboard', ['uses' => 'SomeController@index', 'as' => 'my.dashboard']);
Route::get('home-dashboard', ['uses' => 'SomeController@dashboard', 'as' => 'my.home_dashboard']);

//参见更改了这个“ home-dashboard”的 URI

希望能有所帮助。