Есть приложение с аутентификацией на laravel. Данные сессий пользователей хранятся в redis. В сессиях есть параметр 'theme', в зависимости от которого, у страницы меняется бекграунд на белый, или серый, на всех страницах сайта.
Чтобы реализовать такой функционал, возникла идея, через кастомный middleware вытаскивать данные из редиски и передавать их в шаблоны, где получив к ним доступ, можно будет изменить стили.
Либо же есть другая идея - менять в middleware параметры во внешнем файле стилей, который уже будет статически прикручен к странице.
Не нашёл ни одну подобную реализацию. Как вообще в таком случае поступают?
Спасибо! Спустя много мучений, получилось реализовать. Напрямую через Providers было сделать невозможно, т.к. они запускаются ещё до аутентификации и вытаскивать было нечего.
Создал ThemeProvider, в котором, на каждый View вызывается метод compose в созданном композере:
public function boot()
{
View::composer('*', ThemeComposer::class);
}
В композере же, просто ставлю проверку на аутентификацию, а далее, при выполнении, делюсь с вьюхой значением, в зависимости от параметра сесии:
public function compose(ViewView $view)
{
if (Auth::check()) {
$json = json_decode(Redis::get(auth()->user()->id));
switch ($json->theme) {
case 'light':
View::share('_style', 'light.css');
break;
case 'dark':
View::share('_style', 'dark.css');
break;
default:
View::share('_style', 'light.css');
break;
}
}
}
Далее, в папке public, создаю папку themes, куда и кидаю два вышеописанных файла. А уже в основном blade шаблоне, просто подключаю их по переменной:
Davidaa_WoW, конечно. view share пробрасывает данные по всем вьюхам - используете ее - не нужно использовать compose. и наоборот. ну и в вашем случае вообще должно быть все просто. регаете мидлваре
class ShareMiddleware
{
public function handle($request, Closure $next)
{
view()->share(['somedata' => 1]);
return $next($request);
}
}
И вешаете эту миддлваре там где надо - глобально, на конкретный роут или группу роутов.