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 相关文章推荐
PHPMailer邮件类利用smtp.163.com发送邮件方法
Sep 11 PHP
PHP函数之error_reporting(E_ALL ^ E_NOTICE)详细说明
Jul 01 PHP
深入密码加salt原理的分析
Jun 06 PHP
解析php扩展php_curl.dll不加载的解决方法
Jun 26 PHP
php通过字符串调用函数示例
Mar 02 PHP
php post大量数据时发现数据丢失问题解决方法
Jun 20 PHP
php读取txt文件并将数据插入到数据库
Feb 23 PHP
PHP简单检测网址是否能够正常打开的方法
Sep 04 PHP
magento后台无法登录解决办法的两种方法
Dec 09 PHP
基于yaf框架和uploadify插件,做的一个导入excel文件,查看并保存数据的功能
Jan 24 PHP
PHP编程计算文件或数组中单词出现频率的方法
May 22 PHP
Swoole4.4协程抢占式调度器详解
May 23 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中mysql模块部分功能的简单封装
2011/09/30 PHP
destoon供应信息title调用出公司名称的方法
2014/08/22 PHP
PHP实现函数内修改外部变量值的方法示例
2018/12/28 PHP
Laravel核心解读之异常处理的实践过程
2019/02/24 PHP
Jquery事件的连接使用示例
2013/06/18 Javascript
Jquery api 速查表分享
2015/01/12 Javascript
jQuery实现点击小图显示大图代码分享
2015/08/25 Javascript
js类式继承与原型式继承详解
2016/04/07 Javascript
JavaScript事件学习小结(五)js中事件类型之鼠标事件
2016/06/09 Javascript
Nodejs抓取html页面内容(推荐)
2016/08/11 NodeJs
D3.js实现饼状图的方法详解
2016/09/21 Javascript
微信小程序 五星评价功能的实现
2017/03/09 Javascript
详解vue-cli + webpack 多页面实例配置优化方法
2017/07/13 Javascript
Bootstrap与Angularjs的模态框实例代码
2017/08/03 Javascript
Nodejs中使用phantom将html转为pdf或图片格式的方法
2017/09/18 NodeJs
禁止弹窗中蒙层底部页面跟随滚动的几种方法
2017/12/07 Javascript
JavaScript fetch接口案例解析
2018/08/30 Javascript
微信小程序签到功能
2018/10/31 Javascript
webpack 从指定入口文件中提取公共文件的方法
2018/11/13 Javascript
jQuery实现轮播图效果demo
2020/01/11 jQuery
[02:51]DOTA2战队出征照拍摄花絮 TI3明星化身时尚男模
2013/07/22 DOTA
Python常见字符串操作函数小结【split()、join()、strip()】
2018/02/02 Python
Python Request爬取seo.chinaz.com百度权重网站的查询结果过程解析
2019/08/13 Python
Python使用正则实现计算字符串算式
2019/12/29 Python
Python爬虫如何应对Cloudflare邮箱加密
2020/06/24 Python
东南亚地区最大的购物网站Lazada新加坡站点:Lazada.sg
2016/07/17 全球购物
美国女鞋品牌:naturalizer(娜然)
2016/08/01 全球购物
高中考试作弊检讨书
2014/01/14 职场文书
搞笑创意广告语
2014/03/17 职场文书
应届大专毕业生自我鉴定
2014/04/08 职场文书
工作收入证明范本
2015/06/12 职场文书
婚礼嘉宾致辞
2015/07/28 职场文书
检举信的写法
2019/04/10 职场文书
golang 实现两个结构体复制字段
2021/04/28 Golang
使用react-virtualized实现图片动态高度长列表的问题
2021/05/28 Javascript
Python OpenCV形态学运算示例详解
2022/04/07 Python