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也可以?成Shell Script
Oct 09 PHP
php mysql索引问题
Jun 07 PHP
探讨PHP调用时间格式的参数详解
Jun 06 PHP
php生成百度sitemap站点地图类函数实例
Oct 17 PHP
php递归法读取目录及文件的方法
Jan 30 PHP
PHP cURL初始化和执行方法入门级代码
May 28 PHP
详解PHP的Yii框架的运行机制及其路由功能
Mar 17 PHP
PHP连接数据库实现注册页面的增删改查操作
Mar 27 PHP
[原创]php正则删除img标签的方法示例
May 27 PHP
form自动提交实例讲解
Jul 10 PHP
PHP实现超简单的SSL加密解密、验证及签名的方法示例
Aug 28 PHP
PHP+redis实现的悲观锁机制示例
Jun 12 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
php使用explode()函数将字符串拆分成数组的方法
2015/02/17 PHP
兼容FireFox 的 js 日历 支持时间的获取
2009/03/04 Javascript
PHP PDO操作总结
2014/11/17 Javascript
JavaScript实现标题栏文字轮播效果代码
2015/10/24 Javascript
jQuery简单动画变换效果实例分析
2016/07/04 Javascript
轮播图组件js代码
2016/08/08 Javascript
jQuery实现鼠标经过像翻页和描点链接效果
2016/08/08 Javascript
Java中int与integer的区别(基本数据类型与引用数据类型)
2017/02/19 Javascript
jQuery时间验证和转换为标准格式的时间格式
2017/03/06 Javascript
AngularJS+bootstrap实现动态选择商品功能示例
2017/05/17 Javascript
最后说说Vue2 SSR 的 Cookies 问题
2018/05/25 Javascript
JavaScript常见继承模式实例小结
2019/01/11 Javascript
如何将百度地图包装成Vue的组件的方法步骤
2019/02/12 Javascript
Json实现传值到后台代码实例
2020/06/30 Javascript
vue实现自定义多选按钮
2020/07/16 Javascript
javascript实现固定侧边栏
2021/02/09 Javascript
[16:04]DOTA2海涛带你玩炸弹 9月5日更新内容详解
2014/09/05 DOTA
python使用PyV8执行javascript代码示例分享
2013/12/04 Python
Python处理RSS、ATOM模块FEEDPARSER介绍
2015/02/18 Python
安装Python的web.py框架并从hello world开始编程
2015/04/25 Python
详解使用python的logging模块在stdout输出的两种方法
2017/05/17 Python
python实现linux下抓包并存库功能
2018/07/18 Python
Python操作MySQL数据库的两种方式实例分析【pymysql和pandas】
2019/03/18 Python
详解利用python+opencv识别图片中的圆形(霍夫变换)
2019/07/01 Python
python实现将一维列表转换为多维列表(numpy+reshape)
2019/11/29 Python
Django模板获取field的verbose_name实例
2020/05/19 Python
python 三种方法实现对Excel表格的读写
2020/11/19 Python
彻底解决pip下载pytorch慢的问题方法
2021/03/01 Python
html5如何在Canvas中实现自定义路径动画示例
2017/09/18 HTML / CSS
Free People中国官网:波西米亚风格女装服饰
2016/08/30 全球购物
Scotch Porter官方网站:男士美容产品
2020/08/31 全球购物
服装设计师职业生涯规划范文
2014/02/28 职场文书
预备党员承诺书
2014/03/25 职场文书
文明单位汇报材料
2014/12/24 职场文书
信贷客户经理岗位职责
2015/04/09 职场文书
Django项目配置Memcached和Redis, 缓存选择哪个更有优势
2021/04/06 Python