主题包 igaster
Themes with package igaster
我现在正在我的项目中实施主题。
我已经安装了 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',
在我的路线文件中我有这条路线:
路线::获取('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: exception 'ReflectionException' with message 'Class hash does not exist'
Laravel 4 对开发人员友好且令人惊叹。 Laravel 5 已经翻过山了。 L6估计没法用了
如果您正确按照安装说明进行操作 (https://github.com/igaster/laravel-theme),您可以像这样更改主题:
Theme::set('theme-name');
如果您想通过单击 link 更改主题,您必须将当前主题名称存储在某处。很可能你不想将它存储在 URI 中,所以我建议你将它存储在会话中。
由于 Laravel5 中的会话是在中间件堆栈中启动的,因此您应该创建自己的中间件并将其放置在 Kernel.php
中的 $middleware
数组中。这是一个示例中间件:
class myMiddleware {
public function handle($request, Closure $next) {
$themeName = \Session::get('themeName', 'NONE');
if(\Theme::exists($themeName))
\Theme::set($themeName);
return $next($request);
}
}
你的 routes.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) 才能正常工作
我现在正在我的项目中实施主题。 我已经安装了 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',
在我的路线文件中我有这条路线:
路线::获取('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: exception 'ReflectionException' with message 'Class hash does not exist'
Laravel 4 对开发人员友好且令人惊叹。 Laravel 5 已经翻过山了。 L6估计没法用了
如果您正确按照安装说明进行操作 (https://github.com/igaster/laravel-theme),您可以像这样更改主题:
Theme::set('theme-name');
如果您想通过单击 link 更改主题,您必须将当前主题名称存储在某处。很可能你不想将它存储在 URI 中,所以我建议你将它存储在会话中。
由于 Laravel5 中的会话是在中间件堆栈中启动的,因此您应该创建自己的中间件并将其放置在 Kernel.php
中的 $middleware
数组中。这是一个示例中间件:
class myMiddleware {
public function handle($request, Closure $next) {
$themeName = \Session::get('themeName', 'NONE');
if(\Theme::exists($themeName))
\Theme::set($themeName);
return $next($request);
}
}
你的 routes.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) 才能正常工作