Laravel Blade не работает с методом Sentry

Я пытаюсь написать представление .blade.php, которое делает:

  • Показать информацию о профиле пользователя
  • Если пользователь забанен, показать сообщение «Пользователь забанен». вместо.
  • Если вы вошли в систему как 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

Решение

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(), если вам это нужно.

0

Другие решения

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

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

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

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

в

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

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

Спасибо!

0

По вопросам рекламы [email protected]