In a previous article, I introduced how to dynamically change the template file path by defining the Response macro. Implement the theme function: Laravel implements the template theme function, but later I discovered that this method has a drawback. When using @extends in the template, you must explicitly specify the template path, which may cause confusion. I decided to change my mind between themes. It should be completely isolated. If it doesn't exist, it doesn't exist. Don't automatically look for alternative templates in other themes.
The original way of defining the response macro can be implemented, but I decided to use a more standardized method.
There is a method View::addNamespace in laravel's View class. This method is mentioned in the "Developing Extension Packages" section of the manual. I have to say that the layout logic of the Laravel manual is confusing. The description of this method should be placed in "View" Chapters are, so I won’t go into the digression. Let’s talk about this method first.
There is a way to write laravel rendering view:
Copy code The code is as follows:
View::make('namespace::path');
//For example View::make('default::index.index');
How to define namespace is through this method:
Copy code The code is as follows:
View::addNamespace('default',app_path().'/views/default');
Smart friends may have realized that this function can help us theme the template, such as:
Copy code The code is as follows:
//Register blue theme
View::addNamespace('blue',app_path().'/views/blue');
//Register red theme
View::addNamespace('red',app_path().'/views/red');
//Register green theme
View::addNamespace('green',app_path().'/views/green');
:
Copy code The code is as follows:
//Render the index.index template under the green theme
View::make('green::index.index');
However, we need to register the path mapping of these themes through the View::addNamespace method in advance, and we need to explicitly specify the namespace when rendering.
I don’t think it’s very convenient. Can’t View set a default namespace? In this way we only need to set it once, for example:
Copy code The code is as follows:
//We can write this in __construct
View::setDefaultNamespace('blue',app_path().'/views/blue');
:
Copy code The code is as follows:
//Actually equivalent to View::make('blue::index.index');
View::make('index.index');
Furthermore, we can set the theme through the background, write the theme name into the database, and the front-end reads and sets the theme:
Copy code The code is as follows:
//Assume that the configuration is read from the database, Option is the model class
$theme = Option::getByKey('theme');
View::setDefaultNamespace($theme,app_path().'/views/'.$theme);
This enables background switching of themes.
But unfortunately, View does not have a setDefaultNamespace method, so I decided to create a project to extend the core class library specifically for laravel. This function has been implemented. You can view my project: project address, in src/Keepeye/Laravel/ View/View how to use it.
Okay, we have discussed the implementation of the laravel template theme function here. I hope you will like it.