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程序的php代码
Apr 07 PHP
PHP set_time_limit(0)长连接的实现分析
Mar 02 PHP
解析php中的escape函数
Jun 29 PHP
php检测用户是否用手机(Mobile)访问网站的类
Jan 09 PHP
php+xml实现在线英文词典查询的方法
Jan 23 PHP
PHP 下载文件时如何自动添加bom头及解释BOM头和去掉bom头的方法
Jan 04 PHP
PHP简单操作MongoDB的方法(安装及增删改查)
May 26 PHP
PHP微信刮刮卡 附微信接口
Jul 22 PHP
ThinkPHP3.2.3框架邮件发送功能图文实例详解
Apr 23 PHP
Yii2框架控制器、路由、Url生成操作示例
May 27 PHP
php遍历目录下文件并按修改时间排序操作示例
Jul 12 PHP
基于PHP的登录和注册的功能的实现
Aug 06 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 XML操作类DOMDocument
2009/12/16 PHP
php var_export与var_dump 输出的不同
2013/08/09 PHP
ThinkPHP3.1.x修改成功与失败跳转页面的方法
2017/09/29 PHP
PHP7内核之Reference详解
2019/03/14 PHP
jQuery获得包含margin的outerWidth和outerHeight的方法
2015/03/25 Javascript
jQuery简单实现日历的方法
2015/05/04 Javascript
jQuery Ajax 全局调用封装实例代码详解
2016/06/02 Javascript
AngularJS 避繁就简的路由
2016/07/01 Javascript
jquery之别踩白块游戏的简单实现
2016/07/25 Javascript
js阻止冒泡和默认事件(默认行为)详解
2016/10/20 Javascript
Node.js中process模块常用的属性和方法
2016/12/13 Javascript
Bootstrap实现提示框和弹出框效果
2017/01/11 Javascript
微信小程序 详解Page中data数据操作和函数调用
2017/01/12 Javascript
vue中引用swiper轮播插件的教程详解
2018/08/16 Javascript
vue 保留两位小数 不能直接用toFixed(2) 的解决
2020/08/07 Javascript
小程序实现上下切换位置
2020/11/16 Javascript
[54:58]完美世界DOTA2联赛PWL S2 LBZS vs Rebirth 第一场 11.25
2020/11/25 DOTA
Python中用startswith()函数判断字符串开头的教程
2015/04/07 Python
利用Python生成文件md5校验值函数的方法
2017/01/10 Python
Python 安装setuptools和pip工具操作方法(必看)
2017/05/22 Python
TF-IDF算法解析与Python实现方法详解
2017/11/16 Python
解决nohup重定向python输出到文件不成功的问题
2018/05/11 Python
python读取一个目录下所有txt里面的内容方法
2018/06/23 Python
浅谈django三种缓存模式的使用及注意点
2018/09/30 Python
Python OpenCV对本地视频文件进行分帧保存的实例
2019/01/08 Python
selenium跳过webdriver检测并模拟登录淘宝
2019/06/12 Python
实例讲解使用CSS实现多边框和透明边框的方法
2015/09/08 HTML / CSS
HTML5拖拽功能实现的拼图游戏
2018/07/31 HTML / CSS
恶意软件的定义
2014/11/12 面试题
电气专业应届生求职信
2013/11/01 职场文书
测绘工程个人的自我评价
2013/11/23 职场文书
老师给学生的表扬信
2014/01/17 职场文书
软件工程毕业生自荐信
2014/07/04 职场文书
2015纪念九一八事变84周年演讲稿
2015/03/19 职场文书
Angular CLI发布路径的配置项浅析
2021/03/29 Javascript
Redis高并发缓存架构性能优化
2022/05/15 Redis