Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 31.08.2017 01:27:46

роли юзера в layout.blade.php

для вывода уникального меню (взависимости от роли пользователя)во вьюхе лейаута есть такой код:

@section('navbar')
        @if(!Request::is('/*') and $isClient)
            <li><a href="{{ url('/') }}">кабинет клиента</a></li>
        @endif
        @if(!Request::is('master') and $isMaster)
            <li><a href="{{ url('master') }}">кабинет мастера</a></li>
        @endif
        @if(!Request::is('admin') and $isAdmin)
            <li><a href="{{ url('admin') }}">админка</a></li>
        @endif
@endsection

переменные $isClient, $isMaster, $isAdmin определяются в контроллере и далее происходит return view('вьюха')->with(['isClient' => $isClient, 'isMaster' => $isMaster, 'isAdmin' => $isAdmin]);
проблема в том, что это "популярный лейаут" и используется где только можно. Следовательно чтобы избежать повтора кода в разных контроллерах - переменные $isClient, $isMaster, $isAdmin желательно получать прямо в лейауте. Однако такой вариант не выглядит правильным.
Подскажите как сделать не через зад? Какая практика является правильной?

Изменено Yurri_87 (31.08.2017 04:07:59)

Не в сети

#2 31.08.2017 07:52:55

Re: роли юзера в layout.blade.php

Я делаю глобальных помощников (helpers) в стиле Laravel, которые можно вызывать из любой части приложения через isAdmin(), например. Ты можешь вызывать этого помощника в представлениях, контроллерах, при работе с авторизацией и т.д. Пример кода для помощника:

if (!function_exists('isAdmin')) {
    function isAdmin()
    {
        return auth()->check() && in_array(auth()->user()->role, [3,4]);
    }
}

Это самый удобный способ, плюс код получается читаемый.

Если используешь более сложную систему, подгружай ленивой жадной загрузкой роли (метод load) в модель User.

Еще можно использовать метод share() для передачи данных во все представления.

Можно добавить методы isAdmin и др. в модель User и вызывать их из любой части приложения через:

auth()->user()->isAdmin()

Изменено AlexeyMezenin (03.09.2017 11:57:57)

Не в сети

#3 31.08.2017 10:05:09

Re: роли юзера в layout.blade.php

Как по мне так для таких целей лучше использовать посредника. Или я чего-то не знаю ?

Не в сети

#4 31.08.2017 16:15:56

Re: роли юзера в layout.blade.php

так все-таки каким образом передавать данные во вьюху?
с тем, как получить роли юзера - проблем нету.
дело в том, что разные роуты используют вьюхи, которые наследуются от одного и того же лейаута, поэтому вопрос состоит в дублировании кода. Можно ли как-то на этапе роутинга передавать переменную роли? например для целой группы роутов выполнять функцию получения роли, как это будет выглядеть? Или ничего страшного, если роль дергается прямо из вьюхи? Просто это вроде бы плохая практика во вьюхе использовать функции.
Вобщем вопрос не в способе получения роли, а в том откуда ее передать во вьюху.

Изменено Yurri_87 (31.08.2017 16:18:04)

Не в сети

#5 31.08.2017 17:07:56

Re: роли юзера в layout.blade.php

например для целой группы роутов выполнять функцию получения роли, как это будет выглядеть?

Во вьюхе этого делать не стоит.

Или ничего страшного, если роль дергается прямо из вьюхи?

Для таких целей все же лучше всего использовать Middleware

Не в сети

#6 01.09.2017 00:17:43

Re: роли юзера в layout.blade.php

тоесть таким образом?:

namespace App\Http\Middleware;

use Closure;
use User;

class Roles
{
    public function handle($request, Closure $next)
    {
        $isAdmin = User::isAdmin();
        $isClient = User::isClient();
        $isMaster = User::isMaster();
 
        return $next($request);

        а как тут данные то прицепить?????
        return $next($request)->with(['isadmin'=>$isAdmin,'isclient'=>$isClient,'ismaster'=>$isMaster,]); так чтоли???
    }

}

не могу понять каким образом

Изменено Yurri_87 (01.09.2017 00:20:15)

Не в сети

#7 01.09.2017 01:31:36

Re: роли юзера в layout.blade.php

а как тут данные то прицепить?????

public function handle($request, Closure $next)
    {
        View::share('isadmin', User::isAdmin());
        View::share('isclient', User::isClient());
        View::share('ismaster', User::isMaster());

//ну или если хочешь сохранить пару строк то так

        View::share(['isadmin' => User::isAdmin(), 'isclient' => User::isClient(), 'ismaster' => User::isMaster]);
 
        return $next($request);
    }

В любом из этих двух вариантов isadmin, isclient, ismaster можно будет использовать как переменные во вьюхе.

Только не забудь use View прописать в посреднике и в конструкте контроллера этого самого посредника!

Не в сети

#8 01.09.2017 15:11:20

Re: роли юзера в layout.blade.php

и последний вопрос: насколько логично это делать в middleware?
не будет ли это логичнее сделать в группе роутов? Если да - то как(код)?

Изменено Yurri_87 (01.09.2017 15:11:47)

Не в сети

#9 01.09.2017 15:43:08

Re: роли юзера в layout.blade.php

не будет ли это логичнее сделать в группе роутов?

А если к примеру потом надо будет эти данные приделовать и ко второй, третей группе роутов? Будете дублировать код ?

Тут по сути все просто прописали ресоурс роут и в конструкте контроллера указали посредника )

Не в сети

#10 02.09.2017 22:02:59

Re: роли юзера в layout.blade.php

порылся в русскоязычной документации, нашел такое:

Route::resource('photos', 'PhotoController');

это то самое? Если нет, то можно, пожалуйста код написать? Очень благодарен за инфу.

Не в сети

#11 02.09.2017 22:49:37

Re: роли юзера в layout.blade.php

В web.php

Route::resource('photos', 'PhotoController');

Ресорс контроллер изначально поставляется с базовыми методами (index, create, store, show, edit, update, destroy)

Дописываешь

public function __construct()
{
      $this->middleware('checkRole'); //тут название твоего посредника
}

если все же хочешь определить данного посредника для группы роутов то так:

Route::group(['middleware' => 'checkRole'], function()
{
    Route::resource('photos', 'PhotoController');
});

Не в сети

#12 15.09.2017 07:14:03

Re: роли юзера в layout.blade.php

если не ошибаюсь - посредники созданы чтобы не пропустить запрос дальше. Разве подходит использование посредника, если мне нужно не запретить прохождение запроса дальше, а просто определить роль и передать ее название в переменной, чтобы уже во вьюхе, взависимости от имени роли вывести нужные кнопки.
вьюха:

if($role == 'masger'){
  echo '<div class="button" href="ссылка для мастера">Кнопка для мастера</div>';
}
if($role == ....)...

прошло уже много времени и свежим взглядом я подумал, что раньше меня поняли не до конца.

Не в сети

Подвал раздела