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

在之前一篇文章中我介绍了通过定义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模板主题功能的实现,我们就探讨到这里了,希望大家能够喜欢。

(0)

相关推荐

  • Laravel 5框架学习之Blade 简介

    在多个页面中我们可能包含相同的内容,像是文件头,链接的css或者js等.我们可以利用布局文件完成这个功能. 让我们新建一个布局文件,例如 views/layout.blade.php <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <link rel="s

  • 初识laravel5

    目录结构变化 laravel5最先强调的是项目目录结构的变化,与4.2区别还是蛮大的,逐条来说吧. 新的目录结构看上去像这样: app     Commands     Console     Events     Handlers         Commands         Events     Http         Controllers         Middleware         Requests         Kernel.php         routes.ph

  • Laravel5中contracts详解

    我们先来看看官方文档中对contracts的定义: Laravel's Contracts are a set of interfaces that define the core services provided by the framework. 意思是说Laravel的Contracts是一个由 框架提供 的定义了 核心服务接口 的集合. 也就是说,每一个Contract都是一个接口,对应一个框架核心服务. 那它的意义何在?官网给出的解释也很简单:使用接口是为了 松耦合 和 简单 . 先

  • Laravel 5框架学习之环境与配置

    .env 文件是配置文件,包括数据库配置信息,查看 config->database.php ,connections 里面包含了所有数据库的配置,可以在 default 中选择要使用的数据库.在数据库配置中,有关 env('DB_HOST', 'localhost') 就是读取 .env 配置文件的信息.第二个参数是缺省参数. 我们使用 mysql 数据库,修改 .env: DB_HOST=localhost DB_DATABASE=laravel DB_USERNAME=root DB_PA

  • Laravel 5框架学习之向视图传送数据

    我们在Routes.php中新建一个路由 复制代码 代码如下: Route::get('about', 'PagesController@about'); 在浏览器中浏览会获得一个错误,错误信息仅仅是一个提示信息,缺少细节,在生产环境 It' ok,但是开发阶段我们希望获得详细信息. 在项目的根目录找到 .env 文件,修改 复制代码 代码如下: APP_DEBUG=true 这将显示详细的错误信息,PagesController 不存在.但在生产环境一定要设置为 false 我们可以手工新建控

  • Laravel 5 学习笔记

    1.Laravel 5 动态设置缓存引擎 复制代码 代码如下: \Config::set('cache.default','redis'); var_dump( \Config::get('cache.default') );  \Config::set('cache.default','memcached'); var_dump( \Config::get('cache.default') ); 2.Laravel 5 中 \ 和use Illuminate\Support\Facades\

  • Laravel 5框架学习之数据库迁移(Migrations)

    database migrations 是laravel最强大的功能之一.数据库迁移可以理解为数据库的版本控制器. 在 database/migrations 目录中包含两个迁移文件,一个建立用户表,一个用于用户密码重置. 在迁移文件中,up 方法用于创建数据表,down方法用于回滚,也就是删除数据表. 执行数据库迁移 复制代码 代码如下: php artisan migrate #输出 Migration table created successfully. Migrated: 2014_1

  • Laravel 5.0 发布 新版本特性详解

    译注: 期待 Laravel 5.0 已经很久很久了, 之前跳票说要到今年一月份发布. 从一月份就一直在刷新官网和博客, 始终没有更新的消息, 前几天终于看到官网文档切换到了 5.0 版. 新版本带来了众多令人激动的新特性, 尤其是定时任务队列和表单请求两个特性, 光看一下更新说明中的简单介绍都忍不住要上手尝试了. 今天总算抽出一点时间把官方的新特性说明文档简单地翻译了一下, 希望所有喜欢 Laravel 框架的朋友都能感受到这个版本带来的激动人心的改变. 当然, 如果你需要的是 Phalcon

  • laravel 5 实现模板主题功能

    众所周知,laravel渲染模板是通过View::make()实现的,需要显式指定模板文件路径: 复制代码 代码如下: function index() {     return View::make('index.index'); } 既然这样,我们就可以自己实现模板主题功能,我们只需要将模板文件放到一个主题名称对应的目录里就行,比如默认主题为 default 的话,我们就这样写: 复制代码 代码如下: function index() {     return View::make('def

  • Laravel 5框架学习之Laravel入门和新建项目

    此系列文章是 laracasts.com 中的入门系列视频的笔记,我做了一些修改,可以参考此系列文章来学习 Laravel 5.原视频作者是 Jeffrey Way, 在此感谢.本人使用的系统是Mac系统,但是无论Mac还是Windows用户,都推荐使用虚拟机安装linux(server版即可),然后采用共享文件夹的方式开发.所有的命令行命令应该在虚拟中执行,文件修改在主机中,推荐使用phpstorm. Laravl 是什么 Laravel是一套简洁.优雅的PHP Web开发框架 (PHP We

  • Laravel 5框架学习之路由、控制器和视图简介

    查看 app/Http/routes.php 复制代码 代码如下: Route::get('/', 'WelcomeController@index'); @是一个界定符,前面是控制器,后面是动作,表示当用户请求url / 的时候,执行控制器 WelcomeController 中的 index 方法 复制代码 代码如下: app/http/controllers/welcomecontroller.php public function index() { return view('welco

  • Laravel 5框架学习之向视图传送数据(进阶篇)

    我们不仅仅可以向视图传送一个数据,同样我们可以传送Array 复制代码 代码如下: public function about()     {         return view('pages.about')->with([             'first' => 'Zhang',             'last' => 'Jinglin'         ]);     } <h1>About {{ $first }} {{ $last }}</h1&g

随机推荐