Темы с пакетом igaster

Я сейчас реализую темы в своем проекте. Я установил пакет igaster/laravel-theme.

Хотя я могу переключать темы, изменяя тему по умолчанию в config / themes.php, я понятия не имею, как изменить тему по сторонам - с помощью кнопки, подобной этой:

<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 я не могу прочитать ни значения, хранящиеся в 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 будет непригодным для использования.

2 ответа

Решение

Поскольку сеансы в 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, поэтому я советую вам сохранить его в сеансе.

Другие вопросы по тегам