Я сейчас реализую темы в моем проекте.
Я установил пакет igaster / laravel-theme.
Хотя я могу переключать темы, изменяя тему по умолчанию в config / themes.php, я не знаю, как изменить тему по всему сайту — с такой кнопкой:
<a href="set_theme/2">change to 2</a>.
Автор пакета говорит, что мне нужно использовать ServiceProvide.
Я создал один.
И что теперь?
Изменить: решение
Основываясь на ответе igaster, я заставил его работать — ЧАСТИЧНО.
Это более подробное описание того, что я сделал:
В этом файле:
App / Провайдеры / 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');}}
}
Я зарегистрировал поставщика услуг в моем конфиг / 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 issueif (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 я не могу прочитать ни значения, хранящиеся в Session, ни файлы 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);
}
}
ваш rout.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, поэтому я советую вам сохранить его в сеансе.