【问题标题】:Laravel generating invalid routesLaravel 生成无效路由
【发布时间】:2015-08-12 08:09:29
【问题描述】:

我不知道 laravel 发生了什么,当我执行某些操作时,laravel 会生成无效路由,例如当我打开 cmets 框以单击按钮 cmets 模态框打开罚款但当我在 chrome 开发人员选项中看到时 -> 网络显示我有很多无效的路线。知道为什么会这样吗?

请看附件截图:

Admin 是我的路由前缀

Route::group(['prefix' => 'admin', 'before' => 'allow_only_admin'], function () {
});

http://projecturl.com/admin/order/

Route::filter('allow_only_admin', function () {
    if (Auth::check() && !Auth::user()->is('admin')) {
        return redirect()->intended('user/login');

    } else {

    }
});

这是我的 ABC 中间件:

class Abc {

    public function handle($request, Closure $next) {
        if (\Auth::check() && \Auth::user()->admin) {
            return $next($request);
        }
        return redirect()->route('user.login');
    }
}

这是我的 No_auth 过滤器:它检查用户登录并重定向到它的用户角色

Route::filter('no_auth', function () {
    if (Auth::check()) {
        if (Auth::user()->is('admin')) {
            return Redirect::route('orders.all');
        }

        if (Auth::user()->is('writer')) {
            return Redirect::route('windex');
        }

        if (Auth::user()->is('teamlead')) {
            return Redirect::route('tlindex');
        }
    }
});

这是登录路径:

Route::group(['prefix' => 'user', 'before' => 'no_auth'], function () {
    Route::get('login', ['as' => 'user.login', 'uses' => 'Auth\AuthController@showLoginForm']);
});
Route::post('user/login', ['as' => 'user.post.login', 'uses' => 'Auth\AuthController@postLogin']);
Route::get('user/logout', ['as' => 'user.logout', 'uses' => 'Auth\AuthController@getLogout']);

【问题讨论】:

  • 你能用 pastebin 发布你的 allow_only_admin 中间件吗?
  • 这不是无效的路线。您正在重定向几乎所有请求。
  • 我不知道为什么它创建无效以及它是如何重定向的

标签: laravel routes laravel-5


【解决方案1】:

您的中间件可能与这些重定向无限循环。我尝试过一次重定向,然后就发生了。我建议重新组织您的管理中间件,这是我使用的:

App\Http\Middleware\Admin.php:

<?php namespace App\Http\Middleware;

use Closure;

class Admin {

    public function handle($request, Closure $next)
    {
        if (\Auth::check() && \Auth::user()->admin) {
            return $next($request);
        }
       return redirect()->route('some.route');
    }
}

App/Http/Kernel.php

protected $routeMiddleware = [
    ...
    'admin' => 'App\Http\Middleware\Admin',
];

将此设置为中间件:在Kernel.php 中添加'admin' =&gt; 'App\Http\Middleware\Admin', 然后在routes.php 中: Route::group(['middleware' => 'admin'], function() { ...管理路线...

编辑: 添加更多代码后,这里有一些提示,也许它们会帮助您解决问题。

您不需要路由过滤器,将它们全部删除。使用路由组,因此管理员路由在此语句中:

routes.php

Route::group(['middleware' => 'admin', 'prefix' => 'admin'], function() {
   ... admin routes
}

不要忘记在 Kernel.php 中使用正确的名称(在我的示例中为admin)注册管理中间件。

要将用户重定向到他们自己的区域,请尝试将逻辑放在Auth\AuthController@postLogin 的登录后路由中。在那里,您将检查凭据是否正确 (Auth::attempt),如果正确,请使用 if else 将用户重定向到正确的位置。

您不需要 no_auth 过滤器,只需将其删除即可。

【讨论】:

  • 像这样添加到内核中 protected $routeMiddleware = [ 'admin' => 'App\Http\Middleware\Admin', ];但出现错误:Container.php 第 776 行中的 ReflectionException:类管理员不存在
  • Admin.php 第 6 行中的 FatalErrorException:无法重新声明类 App\Http\Middleware\Admin
  • 您是否在Http/Middleware 文件夹中创建了中间件文件?在kernel.php 中,您将中间件名称映射到中间件文件,因此如果将该文件映射到admin,则您将控制器中间件仅设置为该名称。我将添加更多代码。
  • 您的第一个错误看起来像 Kernel.php 没有将单词“admin”映射到当前的中间件。第二个错误看起来你在中间件命名空间中有另一个 Admin 类。
  • 一切都很好,但是新的错误/警告这个网页有一个重定向循环 ERR_TOO_MANY_REDIRECTS
猜你喜欢
  • 2016-01-06
  • 1970-01-01
  • 2017-05-13
  • 1970-01-01
  • 2021-02-18
  • 2018-09-21
  • 1970-01-01
  • 2021-03-12
  • 2013-08-21
相关资源
最近更新 更多