2014-12-23 3 views
0

Я пытаюсь написать мнение .blade.php, что делает:Laravel Лезвие не работает с Sentry методом

  • Показать информацию о профиле пользователя
  • Если пользователь запрещенное, появляется сообщение «Пользователь запрещен ". вместо.
  • Если вы вошли в систему как ADMIN (то есть, если у вас есть разрешение «admin»), вместо того, чтобы показывать это сообщение, покажите профиль пользователя с дополнительной информацией о том, что пользователь запрещен.

    Вот мое мнение:

    @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 не распознает его как объект. Что бы это могло быть? Есть ли простое решение?

Заранее благодарен!

+0

'Cartalyst \ Sentry \ Users \ UserNotFoundException' Все, что печатает для одного исключения? –

ответ

0

Хорошо, проблема решена.

@patricus, спасибо за помощь! Это было не то, что я имел в виду, но он дал мне информацию, в которой я нуждался. Когда я вызвал метод Sentry::getUser(), я пытался получить пользователя, который в настоящее время вошел в систему, и видя его, а не владельца профиля. Но, как вы сказали, метод возвращал NULL, потому что я использовал его, не проверяя, есть ли вошедший пользователь в начале!

Так что на самом деле констатировала вопрос переписывания

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

в

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

И спасибо за дополнительные советы. Я довольно новичок в Sentry, Laravel и PHP, поэтому код может стать беспорядочным. Все фиксированные и очищенные.

Спасибо!

0

Sentry::getUser() вернет null, если пользователь заблокирован. Поэтому вы вызываете hasAccess() на нулевом объекте, указав на ошибку, которую видите.

Я предполагаю, что ваша модель User расширяет модель Cartalyst\Sentry\Users\Eloquent\User, поэтому, на ваш взгляд, вы можете просто использовать $user->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->isBanned() вместо проверки $throttle->banned == 1. Аналогично для $throttle->isSuspended(), если вам это нужно.