В настоящее время я реализую темы в своем проекте. Я установил пакет igaster / laravel-theme.
Хотя я могу переключать темы, изменяя тему по умолчанию в config / themes.php, я понятия не имею, как изменить тему sitewide – с помощью такой кнопки:
<a href="set_theme/2">change to 2</a>.
Автор пакета говорит, что мне нужно использовать ServiceProvide. Я создал его. И что теперь?
Изменить: решение
Основываясь на ответе, предоставленном igaster, я заставил его работать – ЧАСТИЧНО. Это более подробное описание того, что я сделал:
В этом файле: App / Providers / themeSelectServiceProvider.php
<?php namespace App\Providers; use Illuminate\Support\ServiceProvider; use Session; use Cookie; use Request; class themeSelectServiceProvider extends ServiceProvider { public function register() { // for testing purpose I ignore the variable and hardcode the theme's name // just in case I test both with and without backslash // as the namespaces in L5 tends to be a major pain. // neither one works. $theme = Session::get('themeName'); // $theme = Request::cookie('themeName'); Session::put('theme', $theme); if ($theme == 'Fawkes') { \Theme::set('Fawkes'); } if ($theme == 'Seldon') { \Theme::set('Seldon'); } else {\Theme::set('Fawkes');} } }
Я зарегистрировал поставщика услуг в файле config / app.php :
'providers' => [ ... 'App\Providers\themeSelectServiceProvider',
в моем файле маршрутов у меня есть этот маршрут:
Route :: get ('set_theme / {themeName}', 'SitewideController @ set_theme2');
который приводит сюда:
use Response; use Theme; use Illuminate\Cookie\CookieJar; class SitewideController extends Controller { public function set_theme2($themeName) { \Theme::set('Seldon'); // I tested them one at a time to determine Theme::set('Seldon'); // if there is a classname issue if (Theme::find($themeName)) // Is $themeName valid? { return Redirect::to('/')->withCookie(cookie()->forever('themeName', $themeName)); // this is the only way I am able to create a cookie. Facade DOESN'T WORK! } Redirect::url('boooo'); // my error page }
Итак, на данный момент я делаю шаг вперед – нижняя строка в моем ServiceProvider меняет тему.
else {\Theme::set('Fawkes');}
Проблема, которая сохраняется:
Внутри ServiceProvider я не могу прочитать ни значение, хранящееся в сеансе, ни какой-либо cookie. Только для целей тестирования я создал
Session::put('theme', $theme);
Но переменная Session НИКОГДА не была создана – не с Cookie, а не с Session.
Пожалуйста, помогите, если возможно
Изменить 2:
Я попытался включить ServiceProvider в код ниже:
if(Auth::check()) { \Theme::set('Seldon'); }
но в результате получается пустой экран (у меня debug = true). В файле журнала я вижу:
local.ERROR: исключение «ReflectionException» с сообщением «Хэш класса не существует»
Laravel 4 был отличным для разработчиков и потрясающим. Laravel 5 уже на холме. Думаю, L6 будет непригодным для использования.
Поскольку сеансы в Laravel5 инициируются в стеке промежуточного программного обеспечения, вы должны создать свое собственное промежуточное программное обеспечение и поместить его в массив $middleware
в Kernel.php
. Это пример промежуточного программного обеспечения:
class myMiddleware { public function handle($request, Closure $next) { $themeName = \Session::get('themeName', 'NONE'); if(\Theme::exists($themeName)) \Theme::set($themeName); return $next($request); } }
ваш route.php может быть чем-то вроде:
Route::get('setTheme/{themeName}', function($themeName){ Session::put('themeName', $themeName); return Redirect::to('/'); }); Route::get('/', function() { return Theme::get(); // display your views here.... });
Обратите внимание, что вам нужно вытащить последнюю версию (v1.0.4), чтобы она работала
Если вы правильно выполнили инструкции по установке ( https://github.com/igaster/laravel-theme ), вы можете изменить тему следующим образом:
Theme::set('theme-name');
Если вы хотите изменить тему, щелкнув ссылку, вы должны где-то сохранить имя текущей темы. Скорее всего, вы не хотите хранить его в URI, поэтому я советую вам сохранить его в сеансе.