【问题标题】:Laravel 5.4 routing for same prefix group but different middleware giving errorLaravel 5.4 路由相同前缀组但不同中间件给出错误
【发布时间】:2018-01-13 03:42:55
【问题描述】:

我需要同一前缀 ma​​nager 下的所有路由,其中​​一个中间件用于访客 ma​​nager_guest,另一个用于登录用户 ma​​nager_auth。 下面这段代码是我的路由 web.php 文件。

还有其他方法吗?

我的路线:

Route::prefix('manager')->group(['middleware' => 'manager_guest'], function () {
    Route::get('/register', 'Manager\RegisterController@showRegister')->name('manager.register.create');
    Route::post('/register', 'Manager\RegisterController@register')->name('manager.register.store');
    Route::get('/login', 'Manager\LoginController@showLogin')->name('manager.login.create');
    Route::post('/login', 'Manager\LoginController@login')->name('manager.login');
});

Route::prefix('manager')->group(['middleware' => 'manager_auth'], function () {
    Route::post('/logout', 'Manager\LoginController@logout')->name('manager.logout');
    Route::get('/profile', 'Manager\PageController@profile')->name('manager.profile');
});

执行php artisan route:list后出错

PHP Warning: Uncaught ErrorException: Array to string conversion in E:\laragon\www\laraveladmin\vendor\laravel\framework\src\Illuminate\Routing\Router.php:329
Stack trace:
#0 E:\laragon\www\laraveladmin\vendor\laravel\framework\src\Illuminate\Routing\Router.php(329): Illuminate\Foundation\Bootstrap\HandleExceptions->handleError(8, 'Array to string...', 'E:\\laragon\\www\\...', 3
29, Array)
#1 E:\laragon\www\laraveladmin\vendor\laravel\framework\src\Illuminate\Routing\Router.php(329): require()
#2 E:\laragon\www\laraveladmin\vendor\laravel\framework\src\Illuminate\Routing\Router.php(285): Illuminate\Routing\Router->loadRoutes(Array)
#3 E:\laragon\www\laraveladmin\vendor\laravel\framework\src\Illuminate\Routing\RouteRegistrar.php(104): Illuminate\Routing\Router->group(Array, Array)
#4 E:\laragon\www\laraveladmin\routes\web.php(30): Illuminate\Routing\RouteRegistrar->group(Array, Object(Closure))
#5 E:\laragon\www\laraveladmin\vendor\laravel\framework\src\Illuminate\Routing\Router.php(329): require('E:\\laragon\\www\\...')
#6 in E:\laragon\www\laraveladmin\vendor\laravel\framework\src\Illuminate\Routing\Router.php on line 329
PHP Fatal error:  Illuminate\Routing\Router::loadRoutes(): Failed opening required 'Array' (include_path='E:\Developer\Wbserver\php\PEAR') in E:\laragon\www\laraveladmin\vendor\laravel\framework\src\Illuminate
\Routing\Router.php on line 329
 
[Symfony\Component\Debug\Exception\FatalErrorException] Illuminate\Routing\Router::loadRoutes(): Failed opening required 'Array' (include_path='E:\Developer\Wbserver\php\PEAR')

【问题讨论】:

    标签: php laravel-5 routing


    【解决方案1】:

    试试这个

    Route::group(['prefix' => 'manager',  'middleware' => 'manager_guest'], function() {
    
        });
    

    【讨论】:

    • 我喜欢这种分享路由属性的方式。但是您需要“复制”这段代码,为所有路由 URI 添加前缀 manager 并分配中间件 manager_auth
    • 你是对的。这仅取决于偏好。在一般用例中,我更喜欢使用group,因为我认为它比使用嵌套的prefixnamespacemiddleware 等更具可读性。
    【解决方案2】:

    你可以像这样“分解”你的代码:

    Route::prefix('manager')->group(function () {
        Route::middleware(['manager_guest'])->group(function () {
            // These will be prefixed with "manager" and assigned the "manager_guest" middleware
        });
    
        Route::middleware(['manager_auth'])->group(function () {
            // These will be prefixed with "manager" and assigned the "manager_auth" middleware
        });
    
        // These will just be prefixed with "manager"
    });
    

    我注意到您的所有控制器都位于子命名空间管理器中。您可以链接这些方法并使您的路线文件更加清晰。例如:

    Route::prefix('manager')->namespace('Manager')->group(function () {
        Route::middleware(['manager_guest'])->group(function () {
            Route::get('register', 'RegisterController@showRegister')->name('mananger.register.create');
        });
    
        Route::middleware(['manager_auth'])->group(function () {
            Route::get('profile', 'PageController@profile')->name('mananger.profile');
        });
    });
    

    【讨论】:

    • 非常感谢它有效。再次感谢命名空间,现在它看起来更干净且易于处理。 :)
    【解决方案3】:

    其他答案都不适合我,因为我有很多路由要更改,并且不想更改命名空间。完成这项工作的关键是“作为”。这样做的缺点是它在使用“route()”时会改变路径,但是你在每条路由上使用 name 无论如何都会覆盖它。

    Route::group(['prefix' => 'manager', 'middleware' => ['manager_guest'], 'as' => 'manager_guest'], function() {
      ...
    }
    
    Route::group(['prefix' => 'manager', 'middleware' => ['manager_auth'], 'as' => 'manager_auth'], function() {
      ...
    }
    

    【讨论】:

      猜你喜欢
      • 2020-10-20
      • 2018-10-20
      • 2021-05-29
      • 2017-09-01
      • 2018-04-13
      • 2020-06-18
      • 2020-12-04
      • 1970-01-01
      • 2016-03-03
      相关资源
      最近更新 更多