Laravel报错“Route not defined”

80

在我的routes.php文件中,我有:

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

在视图文件中(account/preferences.blade.php),我有:

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

但是我遇到了这个错误:

路由 [/preferences/1] 未定义

直接调用 route() 辅助函数时也会出现类似的错误:

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

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


将你的命名空间定义在路径路由控制器下。 - Safoor Safdar
请查看以下链接:http://laravel.com/docs/5.0/routing#route-model-binding - Safoor Safdar
感谢您的回复。我认为路由模型绑定仅在将整个对象传递到路由时才是必需的,而不仅仅是一个整数参数?尽管如此,我已经尝试将App\User的模型“user”注册到路由器中,但仍然无法正常工作。还尝试使用路由中的闭包进行测试,而不是调用控制器方法。 - Ben Fransen
13个回答

99
route()方法,当你在表单开头使用['route' => 'someroute']时调用该方法,需要使用所谓的命名路线。像这样为路由指定名称:

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。 :)


1
作为对这个问题的跟进,如果路由是从 Route::resource('/users', 'UserController'); 生成的资源路由,并且 route:list 显示它的名称为 users.update,但当我尝试生成该路由时,它给出了错误信息。那么 route() 只适用于显式命名的路由吗? - bruchowski
没事了,我深入研究了 FormBuilder.php 的源代码,看起来这个可以用 route: ['users.update', user] - bruchowski
我的问题是我没有意识到我的路由在一个组内。这需要我在我放置的名称前添加一个前缀。 - hossein

47

这个帖子虽然有点老,但是是我找到的第一个帖子,所以我也想分享一下我的解决方案。除了在你的 routes.php 文件中有命名路由之外,这个错误也会在你的路由文件中有重复的 URL,但使用不同的名称时出现,这种情况下错误可能会引人误解。 例如:

```php Route::get('/users', function () { // ... })->name('users.index');
Route::get('/dashboard', function () { // ... })->name('dashboard'); ``` 以上示例中,'/users' 和 '/dashboard' 都有自己的名称,但却是相同的URL,因此会发生错误。
Route::any('official/form/reject-form', 'FormStatus@rejectForm')
                                           ->name('reject-form');  

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

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


1
这对我解决了问题,我移除了我为注册创建的路由(Route::get('/register', 'Auth\RegisterController@getRegister');),并让 Auth::routes() 接管。 - Steve
非常感谢,我因此而疯狂了。即使您有不同的名称,它肯定会出现重复URL的问题。 :) - Hashaam Ahmed

19
如果没有定义路由,则检查web.php路由文件。
Route::get('/map', 'NavigationController@map')->name('map'); // note the name() method.
然后您可以在视图中使用此方法:
<a class="nav-link" href="{{ route('map') }}">{{ __('Map') }}</a>

PS:__('Map') 的作用是将“Map”翻译成当前语言。

您可以通过artisan命令查看路由名称列表:

php artisan route:list

2
谢谢!感谢 php artisan route:list,我意识到我在两个路由中定义了相同的URL:'/same/url/in/both/routes'。这就是为什么其中一个没有出现在路由列表中的原因。 - Pathros
1
谢谢!救了我一命!由于某些原因,route('about')无法访问,直到我在web.php文件中为该路由应用了->name('about')。 - Jeremy

16

我正在使用Laravel 5.7,尝试了所有以上答案,但似乎都没有解决问题。

对我来说,解决方法相当简单,只需删除Laravel创建的缓存文件即可。
似乎我的更改没有被反映出来,因此我的应用程序无法看到路由。

有点过度杀伤力,但我决定同时重置我的所有缓存,使用以下命令:

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

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


这对我有效!缓存在我的应用程序中是持久的。 - Van Tran
php artisan route:clear 可以使用。谢谢。 - Thang Nguyen

8
当您执行该命令时
php artisan route:list

您将在表格格式中看到所有已注册的路由。 您会看到许多列,如"Method"、"URI"、"Name"、"Action"等。
基本上,如果您正在使用"route()"方法,那么它只会接受"name"列的值;如果您想使用"URI"列的值,应该使用laravel的"url()"方法。

8

造成此问题的另一个原因:

如果路由被相同的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已更改

希望对某些人有所帮助。


5

我的情况有点不同,因为它不是一个表格而是返回一个视图。添加方法->name('route')

MyView.blade.php看起来像这样:

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

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

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

3
我曾经遇到过同样的问题,最近找到了解决方法。
你应该检查一下你的路由是否在一个route::group里面,就像这样:
Route::group(['prefix' => 'Auth', 'as' => 'Auth.', 'namespace' => 'Auth', 'middleware' => 'Auth']

如果是这样,你应该在视图文件中使用它。就像这样:
!! Form::model(Auth::user(), ['method' => 'PATCH', 'route' => 'Auth.preferences/' . Auth::user()->id]) !!}

2
在我的情况下,解决方案很简单: 我在 route.php 文件的最开始定义了路由。 将命名路由移到底部后,我的应用程序终于看到它了。 这意味着路由定义得太早了。

在Laravel 5中,只需使用name()函数来指定路由名称。例如: Route::match(['get','post'],'/dish/update/{id}','DishController@storeUpdate')->name('route__name');重定向()->route('route__name',['id'=>$site->id]); - Richard Octovianus

1

顺便提一句:

我遇到了类似的问题,经常会出现"找不到操作方法"的错误,但很明显在控制器中已经定义了。

问题不在于控制器,而是routes.php文件的设置方式。

假设你已经在routes.php文件中将控制器类设置为资源。

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

那么 '/example' 将列出所有 RESTful 资源: http://laravel.com/docs/5.0/controllers#restful-resource-controllers

但是现在你想以某种形式定义,例如:'action'=>'ExampleController@postStore',那么你需要更改此路由(在 route.php 文件中)为:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接