【问题标题】:Laravel Blade not working with Sentry methodLaravel Blade 不适用于 Sentry 方法
【发布时间】:2014-12-24 00:50:34
【问题描述】:

我正在尝试编写一个 .blade.php 视图:

  • 显示用户个人资料信息
  • 如果用户被禁止,显示消息“用户被禁止”。而是。
  • 如果您以管理员身份登录(即,如果您具有“管理员”权限),则不要显示该消息,而是显示用户个人资料以及说明该用户已被禁止的额外信息。

    这是我的看法:

    @extends ('layout.main')
    
    @section('content')
    
    @if(! $throttle->banned==1)
            {{ $user->username }} <br>
            {{ $user->summoner_name }}<br><br>
            {{ $user->bio }}<br>
            {{ $user->punishments }}<br>
    @else
            {{ "This user is banned." }}
                    @if(Sentry::getUser()->hasAccess('admin'))
                            {{ $user->username }} <br>
                            {{ $user->summoner_name }}<br><br>
                            {{ $user->bio }}<br>
                            {{ $user->punishments }}<br>
                            {{ ($throttle->banned == 1) ? "User is banned." : '' }}<br>
                            {{ $throttle->getSuspensionTime() }}<br>
                     @endif
    @endif
    
    @stop
    

还有我的控制器:

<?php

class ProfileController extends BaseController {

        public function main($username) {

                try {
                        $throttle = Sentry::findThrottlerByUserLogin($username);

                        $user = User::where('username','=',$username);

                        if($user->count()) {

                                $user = $user->first();
                                return View::make('profile.main')
                                        ->with('user',$user)
                                        ->with('throttle',$throttle);

                        } else {

                                return App::abort(404);
                        }
                }
                 catch (Cartalyst\Sentry\Users\UserNotFoundException $e)
                 {
                        echo 'User not found.';
                 }
        }

}

也就是说,每当我使用调试器时,我都会不断收到错误“调用非对象上的成员函数 hasAccess()”

@if(Sentry::getUser()->hasAccess('admin'))

语法对我来说看起来不错,所以我真的不明白为什么 Sentry 不将其识别为对象。会是什么呢?有没有简单的解决办法?

提前致谢!

【问题讨论】:

  • Cartalyst\Sentry\Users\UserNotFoundException 一个异常的所有输入?

标签: php laravel blade cartalyst-sentry


【解决方案1】:

如果用户被禁止,Sentry::getUser() 将返回null。因此,您在 null 对象上调用 hasAccess(),从而得到您所看到的错误。

我假设您的 User 模型正在扩展 Cartalyst\Sentry\Users\Eloquent\User 模型,所以我相信您可以在视图中使用 $user-&gt;hasAccess('admin')

其他几点说明:

我认为您可以将控制器缩短为这样的:

try {
    // throws Cartalyst\Sentry\Users\UserNotFoundException if user not found
    $throttle = Sentry::findThrottlerByUserLogin($username);

    // throws Cartalyst\Sentry\Users\UserNotFoundException if user not found
    $user = Sentry::findUserByLogin($username);

    return View::make('profile.main')
        ->with('user',$user)
        ->with('throttle',$throttle);
}
catch (Cartalyst\Sentry\Users\UserNotFoundException $e)
{
    return App::abort(404);
}

另外,您应该使用$throttle-&gt;isBanned() 而不是检查$throttle-&gt;banned == 1。如果您需要,$throttle-&gt;isSuspended() 也是如此。

【讨论】:

    【解决方案2】:

    好的,问题解决了。

    @patricus,感谢您的帮助!这不是我的意思,但它给了我需要的信息。当我调用方法Sentry::getUser() 时,我试图获取当前登录并查看视图的用户,而不是配置文件所有者。但是正如您所说,该方法返回 NULL 因为我使用它时没有检查是否有登录用户!

    所以真正解决问题的是重写

    @if(Sentry::getUser()-&gt;hasAccess('admin'))

    @if(Sentry::check() &amp;&amp; Sentry::getUser()-&gt;hasAccess('admin'))

    感谢您提供的额外提示。我对 Sentry、Laravel 和 PHP 本身还很陌生,所以代码可能会变得混乱。全部固定和清洁。

    谢谢!

    【讨论】:

      猜你喜欢
      • 2015-11-08
      • 2018-03-29
      • 2018-12-28
      • 2018-04-22
      • 1970-01-01
      • 2014-03-01
      • 2021-02-13
      • 2018-09-18
      • 2021-08-15
      相关资源
      最近更新 更多