Я пытаюсь написать представление .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 не распознает его как объект. Что бы это могло быть? Есть ли простое решение?
Заранее спасибо!
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()
, если вам это нужно.
Хорошо, проблема решена.
@patricus, спасибо за помощь! Это было не то, что я имел в виду, но это дало мне информацию, в которой я нуждался. Когда я назвал метод Sentry::getUser()
Я пытался получить пользователя, который в данный момент вошел в систему и видит представление, а не владельца профиля. Но, как вы сказали, метод возвращал NULL, потому что я использовал его, не проверяя, был ли вошедший в систему пользователь для начала!
Так что на самом деле исправил проблему переписывая
@if(Sentry::getUser()->hasAccess('admin'))
в
@if(Sentry::check() && Sentry::getUser()->hasAccess('admin'))
И спасибо за дополнительные советы. Я довольно плохо знаком с Sentry, Laravel и самим PHP, поэтому код может запутаться. Все исправлено и убрано.
Спасибо!