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防注入安全代码
Apr 09 PHP
QQ登录 PHP OAuth示例代码
Jul 20 PHP
如何获知PHP程序占用多少内存(memory_get_usage)
Sep 23 PHP
PHP cdata 处理(详细介绍)
Jul 05 PHP
php判断GIF图片是否为动画的方法
Sep 04 PHP
ThinkPHP中自定义错误页面和提示页面实例
Nov 22 PHP
PHP统一页面编码避免乱码问题
Apr 09 PHP
php编写简单的文章发布程序
Jun 18 PHP
Symfony2之session与cookie用法小结
Mar 18 PHP
PHP中file_exists使用中遇到的问题小结
Apr 05 PHP
使用PHP免费发送定时短信的实例
Oct 24 PHP
PHP文件系统管理(实例讲解)
Sep 19 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
PHP4之COOKIE支持详解
2006/10/09 PHP
php xml实例 留言本
2009/03/20 PHP
setcookie中Cannot modify header information-headers already sent by错误的解决方法详解
2013/05/08 PHP
Laravel jwt 多表(多用户端)验证隔离的实现
2019/12/18 PHP
Highslide.js是一款基于js实现的网页中图片展示插件
2020/03/30 Javascript
jQuery对象数据缓存Cache原理及jQuery.data方法区别介绍
2013/04/07 Javascript
jQuery在iframe中无法弹出对话框的解决方法
2014/01/12 Javascript
jquery解析xml字符串示例分享
2014/03/25 Javascript
node.js正则表达式获取网页中所有链接的代码实例
2014/06/03 Javascript
jQuery 写的简单打字游戏可以提示正确和错误的次数
2014/07/01 Javascript
容易造成JavaScript内存泄露几个方面
2014/09/04 Javascript
JS+CSS实现自适应选项卡宽度的圆角滑动门效果
2015/09/15 Javascript
jQuery实现form表单基于ajax无刷新提交方法详解
2015/12/08 Javascript
Ionic快速安装教程
2016/06/03 Javascript
jQuery EasyUI API 中文帮助文档和扩展实例
2016/08/01 Javascript
详解Angularjs在控制器(controller.js)中使用过滤器($filter)格式化日期/时间实例
2017/02/17 Javascript
vue v-model动态生成详解
2018/06/30 Javascript
解决Layui选择全部,换页checkbox复选框重新勾选的问题方法
2018/08/14 Javascript
Nodejs中怎么实现函数的串行执行
2019/03/02 NodeJs
Python中的高级数据结构详解
2015/03/27 Python
Python3实现的爬虫爬取数据并存入mysql数据库操作示例
2018/06/06 Python
详解Python对JSON中的特殊类型进行Encoder
2019/07/15 Python
Python 无限级分类树状结构生成算法的实现
2021/01/21 Python
Django项目在pycharm新建的步骤方法
2021/03/02 Python
html5中地理位置定位api接口开发应用小结
2013/01/04 HTML / CSS
美国汽车性能部件和赛车零件网站:Vivid Racing
2018/03/27 全球购物
什么是.net
2015/08/03 面试题
授权委托书范文
2014/07/31 职场文书
加强机关作风建设心得体会
2014/10/22 职场文书
导师对论文的学术评语
2015/01/04 职场文书
材料员岗位职责范本
2015/04/11 职场文书
免职通知
2015/04/23 职场文书
因公司原因离职的辞职信范文
2015/05/12 职场文书
家长意见书
2015/06/04 职场文书
2019年妇科护士的自我鉴定(3篇)
2019/09/26 职场文书
Python3 多线程(连接池)操作MySQL插入数据
2021/06/09 Python