【问题标题】:Condition in laravel 5 Middleware always falselaravel 5 中间件中的条件总是错误的
【发布时间】:2017-12-22 17:47:07
【问题描述】:

我试图在我的Middleware 中给出条件。

这是我的脚本

if (auth()->check() && auth()->user()->type == 'TP001') {
    $menu->add("User Control",array('nickname' => "user",'class'=>'treeview'))
    ->append(' <b class="caret"></b>')
    ->prepend('<span class="glyphicon glyphicon-user"></span> ');

    $menu->user->add('Daftar User','user/list');
    $menu->user->add('Tipe User','user/type');
} else {
    /* Some code here...*/
}

上面的脚本即使我已经使用'TP001'(总是在其他)登录,我也看不到带有条件的菜单,然后我尝试用这个来修复我的代码

auth()->user()->isDeveloper()

我的模型

public function isDeveloper()
{
    return ($this->type == 'TP001');
}

但仍然无法正常工作,有没有办法以正确的方式给出上述条件?在此先感谢,并为我的英语不好感到抱歉。

我的内核

  protected $middleware = [
        \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
        \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
        \App\Http\Middleware\TrimStrings::class,
        \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
        \App\Http\Middleware\Frontend::class,
  ];

【问题讨论】:

  • 你的auth()-&gt;user()-&gt;type在哪里? type 存在吗?告诉我你的dd(auth()-&gt;user());我可能会有所帮助
  • @vietnguyen09 当我在中间件中尝试 dd(auth()-&gt;user()) 时,我得到 null 但是当我在控制器中尝试它时,它会显示数组的东西
  • 所以很明显你的条件不能工作,因为你的auth()-&gt;user() 是空的。现在的问题是如何在中间件中获取auth()-&gt;user()
  • 你可以通过 Auth::user() Facade 获取用户。
  • 我已经添加了这个use Illuminate\Support\Facades\Auth;,但仍然无法正常工作

标签: php laravel laravel-5 laravel-5.4 laravel-middleware


【解决方案1】:

您可以像这样在任何刀片文件中获取当前用户:

{{ Auth::user()-&gt;name }}

在你的刀片中这样做:

@if(Auth::check() && Auth::user()->type == 'TP001')
     /* Some code here...*/
@endif

在您的中间件中根据您的要求执行此操作!:

if (\Auth::check() && \Auth::user()->type == 'TP001') { 
     $menu->add("User Control",array('nickname' => "user",'class'=>'treeview')) 
    ->append(' <b class="caret"></b>') 
    ->prepend('<span class="glyphicon glyphicon-user"></span> '); 

    $menu->user->add('Daftar User','user/list'); 
    $menu->user->add('Tipe User','user/type'); 
    } else { 
       /* Some code here...*/ 
}

【讨论】:

    【解决方案2】:

    中间件内核有您发布的$middleware,中间件在每个请求中运行,但它们在路由中间件(您在路由定义中选择)之前运行。

    您可能正在使用“网络”中间件组。尝试在最后添加您的自定义中间件。我认为 Laravel 5.4 中的默认设置是:

    protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            // \Illuminate\Session\Middleware\AuthenticateSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            \App\Http\Middleware\VerifyCsrfToken::class,
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
            \App\Http\Middleware\Frontend::class, // <-- your middleware at the end
        ],
        'api' => [
            'throttle:60,1',
            'bindings',
        ],
    ];
    

    这样您就知道您的中间件将在其他中间件之后运行(启动会话并检查身份验证的中间件)

    【讨论】:

      【解决方案3】:

      您可以像这样将自定义中间件放在内核文件中受保护的 $routeMiddleware = [ ] 数组中

      $routeMiddleWare = ['frontend' => \App\Http\Middleware\Frontend::class]
      

      在此之后,您将能够访问您的 Auth::check 并且不要忘记放

      Route::group(['middleware' => ['frontend']], function() { // your routes will go here.. });
      

      【讨论】:

        猜你喜欢
        • 2022-10-02
        • 2021-07-24
        • 1970-01-01
        • 2021-12-21
        • 1970-01-01
        • 2015-10-15
        • 1970-01-01
        • 1970-01-01
        • 2015-07-21
        相关资源
        最近更新 更多