【问题标题】:Laravel 5 route not defined, while it is?Laravel 5路线未定义,而它是?
【发布时间】:2021-03-17 00:39:57
【问题描述】:

我对这应该如何工作感到有些困惑。但我收到了 Route [/preferences/1] not defined 错误。

在我的 routes.php 中我有:

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

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

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

我收到一条错误消息,告诉我路线不存在。我认为我误解了有关此主题的文档,但我认为我已经为具有给定参数的 PATCH 请求定义了一条路由,并在视图中正确设置了它。

我在这里俯瞰什么?

【问题讨论】:

  • 在路径路由控制器下定义你的命名空间。
  • 感谢您的回复。我认为路由模型绑定只是将整个对象传递给路由所必需的,而不仅仅是一个整数参数?尽管如此,我尝试将App\User 的模型user 注册到路由器,但这仍然不起作用。还尝试使用路由中的闭包而不是调用控制器方法来测试它。

标签: php laravel routes laravel-5


【解决方案1】:

这个帖子很旧,但是是第一个出现的帖子,所以我想我也分享一下我的解决方案。除了在 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::get('/register', 'Auth\RegisterController@getRegister');) 并让 Auth: :routes() 控制
  • 非常感谢,我为此快疯了。即使你有不同的名字,它肯定也会给重复的 URL 带来问题。 :)
【解决方案2】:

还有一个原因:

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

希望它可以帮助一些人。

【讨论】:

    【解决方案3】:

    当你执行命令时

    php artisan route:list
    

    您将在那里以表格形式看到所有已注册的路线。 好吧,您会看到许多列,例如 Method 、 URI 、 Name 、 Action .. 等。

    所以基本上如果你使用 route() 方法,这意味着它只接受 name 列值,如果你想使用 URI您应该使用 laravel 的 url() 方法的列值。

    【讨论】:

      【解决方案4】:

      请注意命令

      php artisan route:list
      

      或获取更多过滤列表

      php artisan route:list | grep your_route|your_controller
      

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

      【讨论】:

        【解决方案5】:

        我正在使用 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:clear 有效。谢谢。
        【解决方案6】:

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

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

        那么你可以在视图中使用这个方法:

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

        PS:__('Map') 是将“地图”翻译成当前语言。

        您可以使用 artisan 命令查看路线名称列表:

        php artisan route:list
        

        【讨论】:

        • 谢谢!感谢php artisan route:list,我意识到在两条路由中我定义了相同的URL:'/same/url/in/both/routes'。这就是为什么其中一个没有在路线列表中列出的原因。
        • 谢谢!救了我!在我将 ->name('about') 应用于路由的 web.php 文件之前,由于某种原因无法访问 route('about')。
        【解决方案7】:

        我的情况有点不同,因为它不是表单而是返回视图。添加方法-&gt;name('route')

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

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

        web.php routes 文件是这样定义的:

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

        【讨论】:

          【解决方案8】:

          我最近遇到了同样的问题并找到了解决方案。

          你应该检查你的路线是否在一个 route::group 内

          喜欢这里:

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

          如果是这样,您应该在视图文件中使用它。喜欢这里:

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

          【讨论】:

            【解决方案9】:

            就我而言,解决方案很简单:

            我在route.php 文件的开头定义了路由。

            将命名路由移到底部后,我的应用终于看到了。 这意味着不知何故,路线定义得太早了。

            【讨论】:

            • 是的,在 laravel 5 中只需使用 name()。例如:Route::match(['get','post'],'/dish/update/{id}','DishController@storeUpdate')->name('route__name'); redirect()->route('route__name',['id'=>$site->id]);
            【解决方案10】:

            附注:

            我遇到过类似的问题,我多次收到错误 Action method not found,但显然它是在控制器中定义的。

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

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

            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');
            

            【讨论】:

              【解决方案11】:

              route() 方法(当您在表单打开中执行 ['route' =&gt; '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' =&gt; 'routename',但由于您有参数,因此您可以创建一个数组并按顺序提供参数。

              话虽如此,由于您似乎正在更新当前用户的首选项,我建议您让处理控制器检查当前登录用户的 id,并以此为基础进行更新 - 无需发送在 url 和路由中的 id 中,除非您的用户也需要更新其他用户的首选项。 :)

              【讨论】:

              • 作为这个问题的后续,如果路由是从say..Route::resource('/users', 'UserController');生成的资源路由怎么办,route:list显示它的名称为users.update,但是当我尝试生成它给我的错误的路线.. route() 仅适用于明确命名的路线吗?
              • 没关系,挖掘 FormBuilder.php 源代码,看起来这可以工作 route: ['users.update', user]
              • 我的问题是我没有意识到我的路线在一个组内。这确实需要我为我输入的名称添加前缀。
              猜你喜欢
              • 1970-01-01
              • 2018-10-15
              • 2023-03-29
              • 1970-01-01
              • 2017-06-04
              • 2016-01-24
              • 2020-05-03
              • 2016-04-02
              相关资源
              最近更新 更多