laravel 5 实现模板主题功能(续)


Posted in PHP onMarch 02, 2015

在之前一篇文章中我介绍了通过定义Response宏的方式来实现动态改变模板文件路径以实现主题功能: laravel实现模板主题功能,但后来我发现这种方法有个弊端,在模板中使用@extends必须显式指定模板路径,这可能造成混乱,我决定还是改变思想,主题和主题之间应该是完全隔离的,不存在就是不存在,不要自动去另外的主题中寻找替代的模板。

而原来定义response宏的方式可以实现,但我决定使用更加规范的方法。

laravel的View类里有一个方法 View::addNamespace ,这个方法在手册"开发扩展包"一节中有提到,不得不说Laravel手册排版逻辑混乱,这个方法说明应当放在"视图"章节才是,题外话就不说了,先来说说这个方法吧。

laravel渲染视图有一种写法:

View::make('namespace::path');

//例如 View::make('default::index.index');

如何定义namespace呢,就是通过这个方法啦:

View::addNamespace('default',app_path().'/views/default');

聪明的朋友可能已经感觉到了,这个功能可以助我们实现模板主题化,比如:

//注册蓝色主题

View::addNamespace('blue',app_path().'/views/blue');

//注册红色主题

View::addNamespace('red',app_path().'/views/red');

//注册绿色主题

View::addNamespace('green',app_path().'/views/green');

之后调用:

//渲染绿色主题下的index.index模板

View::make('green::index.index');

然而我们需要事先通过View::addNamespace方法先注册这几个主题的路径映射,并且在渲染的时候需要显式指定namespace.

我感觉不是很方便,难道View不能设定一个默认的namespace吗?这样我们只要一次设置比如:

//我们可以把这个写在 __construct 里面

View::setDefaultNamespace('blue',app_path().'/views/blue');

之后:

//实际上相当于 View::make('blue::index.index');

View::make('index.index');

更进一步,我们可以通过后台设置主题,把主题名写进数据库,前台读取并设置主题:

//假设从数据库中读取配置,Option是模型类

$theme = Option::getByKey('theme');

View::setDefaultNamespace($theme,app_path().'/views/'.$theme);

这样就实现了后台切换主题了。

但是很遗憾,View并没有setDefaultNamespace方法,所以我决定创建一个项目,专门针对laravel进行核心类库扩展,这个功能已经实现,可以查看我的项目:项目地址 ,在src/Keepeye/Laravel/View/查看使用方法吧。

好了,关于laravel模板主题功能的实现,我们就探讨到这里了,希望大家能够喜欢。

PHP 相关文章推荐
php部分常见问题总结
Mar 27 PHP
YII中assets的使用示例
Jul 31 PHP
跟我学Laravel之配置Laravel
Oct 15 PHP
ThinkPHP有变量的where条件分页实例
Nov 03 PHP
php的ddos攻击解决方法
Jan 08 PHP
深入理解PHP JSON数组与对象
Jul 19 PHP
php 类中的常量、静态属性、非静态属性的区别
Apr 09 PHP
php7基于递归实现删除空文件夹的方法示例
Jun 15 PHP
php实现网页端验证码功能
Jul 11 PHP
Yii2压缩PHP中模板代码的输出问题
Aug 28 PHP
Laravel框架实现多数据库连接操作详解
Jul 12 PHP
PHP实现随机发放扑克牌
Apr 21 PHP
laravel 5 实现模板主题功能
Mar 02 #PHP
Opcache导致php-fpm崩溃nginx返回502
Mar 02 #PHP
使用GDB调试PHP代码,解决PHP代码死循环问题
Mar 02 #PHP
Laravel5中contracts详解
Mar 02 #PHP
php打印一个边长为N的实心和空心菱型的方法
Mar 02 #PHP
初识laravel5
Mar 02 #PHP
避免Smarty与CSS语法冲突的方法
Mar 02 #PHP
You might like
完美解决dedecms中的[html][/html]和[code][/code]问题
2007/03/20 PHP
PHP XML数据解析代码
2010/05/26 PHP
Linux中用PHP判断程序运行状态的2个方法
2014/05/04 PHP
Linux下手动编译安装PHP扩展的例子分享
2014/07/15 PHP
浅谈PHP的反射API
2017/02/26 PHP
PHP实现的多维数组去重操作示例
2018/07/21 PHP
PHP实现的解汉诺塔问题算法示例
2018/08/06 PHP
php设计模式之备忘模式分析【星际争霸游戏案例】
2020/03/24 PHP
在线编辑器的实现原理(兼容IE和FireFox)
2007/03/09 Javascript
javascript 面向对象编程 function也是类
2009/09/17 Javascript
JavaScript arguments 多参传值函数
2010/10/24 Javascript
JavaScript之引用类型介绍
2012/08/10 Javascript
js动态修改整个页面样式达到换肤效果
2014/05/23 Javascript
jQuery实现带滚动线条导航效果的方法
2015/01/30 Javascript
jQuery判断元素上是否绑定了指定事件的方法
2015/03/17 Javascript
JavaScript匿名函数之模仿块级作用域
2015/12/12 Javascript
JavaScript数组去重的多种方法(四种)
2017/09/19 Javascript
基于vue.js快速搭建图书管理平台
2017/10/29 Javascript
详解基于vue-cli配置移动端自适应
2018/01/13 Javascript
简单的vuex 的使用案例笔记
2018/04/13 Javascript
Vue 自定义标签的src属性不能使用相对路径的解决
2019/09/17 Javascript
如何在JavaScript中使用localStorage详情
2021/02/04 Javascript
[04:32]DOTA2著名解说配音敌法师 现场专访海涛怒切假腿
2013/12/20 DOTA
python实现ipsec开权限实例
2014/11/11 Python
python移位运算的实现
2019/07/15 Python
使用tqdm显示Python代码执行进度功能
2019/12/08 Python
浅析Python 条件控制语句
2020/07/15 Python
美国Rue La La闪购网站:奢侈品、中高档品牌限时折扣
2016/10/19 全球购物
CPB肌肤之钥美国官网:Clé de Peau Beauté
2017/09/05 全球购物
世界上最大的曲棍球商店:Pro Hockey Life
2017/10/30 全球购物
印度在线购物网站:Paytmmall
2019/07/24 全球购物
惠而浦美国官网:Whirlpool.com
2021/01/19 全球购物
Kingsoft金山公司C/C++笔试题
2016/05/10 面试题
人事主管的岗位职责
2013/11/16 职场文书
Python数据可视化之绘制柱状图和条形图
2021/05/25 Python
CSS的calc函数用法小结
2022/06/25 HTML / CSS