🔥 Concept

This dynamic theme manager brings theme support to Laravel projects. Theme Manager manages multiple theme at same time and you won't lose build-in Laravel features. This package uses custom middleware for overwriting view path with selected theme.

Add theme-manager middleware alias to your web or custom route chain. Then Theme Manager can manipulate the views.


Installation

⚠️ This package compatible only Laravel 8 and above.

To get the latest version of Laravel Theme Manager, simply require the project using Composer :

> composer require laravel-ready/theme-manager

Publish configs

Run artisan command:

                            
$ php artisan vendor:publish --tag=theme-manager-config
                            
                        

and you can find theme-manager.php file in config folder.

Middleware

Add theme-manager middleware alias to your base route in {route}.php or app/Providers/RouteServiceProvider.php

First way routes/{web}.php
                            
Route::prefix('/')->middleware(['theme-manager', 'another-mw'])->group(function (){
    Route::get('', [LandingController::class, 'index'])->name('home');

    Route::get('my-page', [LandingController::class, 'anyPage'])->name('my-page');
});
                            
                        
Second way RouteServiceProvider.php
                            
public function boot()
{
    $this->configureRateLimiting();

    $this->routes(function () {
        ...

        Route::middleware(['web', 'theme-manager'])
            ->namespace("{$this->namespace}\\Web")
            ->group(base_path('routes/web.php'));

        Route::middleware(['web', 'theme-manager'])
            ->namespace("{$this->namespace}\\Admin")
            ->group(base_path('routes/admin.php'));

    });
}
                            
                        

🚀 Usage


Middleware

Theme Manager works with theme and group pair. We can define default themes in routes and also you can restrict with the route specific theme groups.

⚠️ Parameter ordering does not matter.

Parameter Description Usage
theme Specify theme alias theme-manager:theme=my-theme
group Specify group alias theme-manager:group=admin
restrict_group Restrict route with target group theme-manager:restrict_group=admin

Combined usage examples:

  • theme-manager:theme=my-theme, group=admin, restrict_group=admin
  • theme-manager:theme=my-theme, group=admin
  • theme-manager:group=admin, theme=my-theme

If you want to add a theme you must add group alias because all themes depends to own group. Also to use multiple default theme you first must define group. See multiple and default theme sections for more example.


Service

Theme loading and other options are depends to your logic. You can use ThemeManager service in controller, custom middleware etc.

Scan installed themes

ThemeManager::scanThemes(); returns list of theme groups and their themes. Theme Manager, after themes scanned themes adds to cache. When you add new theme you should rescan the themes. Just pass true as parameter or use ThemeManager::reScanThemes(); method.

Get current theme

ThemeManager::getCurrentTheme(); returns current theme details.

Get target theme

ThemeManager::getTheme(); returns requested theme details.

Set current theme

setTheme is required two parameters. Target theme and theme group. ThemeManager::setTheme('my-theme', 'theme-group')


Views

We can call regular views with return View('welcome'). If you want to call the theme view use theme:: alias like return View('theme::welcome') in controller. theme:: alias is universal gateway for Theme Manager. After you use setTheme method Theme Manager finds theme views then Laravel renders. Also you can't use like theme::theme-name.... You can only define themes with ThemeManager service class and middleware.

                            
class AnyController extends Controller
{
    public function __construct() {
        ThemeManager::addDefaultTheme(['web:red-swan', 'admin:admin-who']);

        $theme = request()->query('theme', 'green-energy');

        ThemeManager::setTheme($theme, 'web');
    }

    public function index(){
        return View('web.welcome');
    }

    public function anyPage(){
        ...

        return View('theme::pages.any-page');
    }
}
                            
                        

Directives

Directive Description Parameters
@asset Get theme asset URL 0: Asset path, 1: Print theme version number (default true)
@assetLoad Get theme asset content as string 0: Asset path, 1: Fallback asset (default null)
@svg Get SVG content as string 0: SVG file name, 1: Class name (default null), 2: CSS style (default null)
  • @asset
    • @asset('css/base.css')
    • @asset('css/base.css', true|false)
    • @asset('js/app.js')
    • @asset('images/user/avatar-01.jpg')
    • @asset('favicons/favion.ico')
  • @assetLoad
    • @assetLoad('css/base.css')
    • @assetLoad('html/any-template.html')
    • @assetLoad('images/svg/sunshine.svg', 'images/svg/moonshine.svg')
  • @svg
    • @svg('chevron-left')
    • @svg('chevron-right', 'mx-auto')
    • @svg('chevron-down', 'mx-auto', 'fill: green; top: 20px; position: relative;')

The above asset paths css, js, html are not reserved or any custom paths are depends to your theme webpack.mix.js configs and design approach.

⚠️ Published theme specific assets must be in project-folder/src/public/themes/{group-alias}/{theme-alias}/ folder because Theme Manager uses this path for directives.


Default Theme

We can define default themes with config file and service class.

Config file

Open theme-manager.php file then set default_theme value. default_theme supports single and multiple themes.

                            
<?php

return [
    ...

    'default_theme' => 'web:red-swan',

    ...
];
                            
                        

or in array

                            
<?php

return [
    ...

    'default_theme' => [
        'web:red-swan',
        'admin:admin-who'
    ],

    ...
];
                            
                        

Service class

...

✳️ Theme


Folder Structure

In your root folder create themes folder then add your themes to own group folder. Also you can change themes folder path with package configs (must be in root folder). Theme folder structure must be like this:

                            
.
└── src
    ├── app
    ├── public
    ├── ...
    ├── {themes}
        ├── web
        │    ├── my-awesome-theme
        │    ├── your-awesome-theme
        │    ├── ...
        ├── admin
        │    ├── banana
        │    ├── cerry
        │    ├── apple
        │    ├── orange
        │    ├── ...
        ├── other-group
        │    ├── other-theme
        │    ├── other-other-theme
        │    ├── ...
        ├── ...
                            
                        

In this case web, admin and other-group is theme group. We use groups for specific purposes. Then we can add specific themes to own group folder. You should publish this package configs, see installation part.

Commands

You can manage themes with commands.

List installed themes

> php artisan theme-manager:list

Result:

                            
⚠️  Check the "theme-config.json" file in the own theme folder for more information.

+-------+---------+--------------+--------------+-------+-----------------------------------+-----------------+---------+
| Index | Default | Name         | Alias        | Group | Description                       | Authors         | Version |
+-------+---------+--------------+--------------+-------+-----------------------------------+-----------------+---------+
|  [1]  | Yes     | Admin Who?   | admin-who    | admin | Dolore officia adipisicing ven... | EgoistDeveloper | 0.0.0   |
|  [2]  | -       | Gentelella   | gentelella   | admin | Gentelella Admin is a free to...  | EgoistDeveloper | 3.1.3   |
|  [3]  | -       | Dark Night   | dark-night   | web   | Find the perfect lights in dar... | EgoistDeveloper | 1.1.3   |
|  [4]  | -       | Green Energy | green-energy | web   | Green energy is any energy typ... | EgoistDeveloper | 4.1.3   |
|  [5]  | Yes     | Red Swan     | red-swan     | web   | The awesome red swan web site...  | EgoistDeveloper | 1.0.1   |
+-------+---------+--------------+--------------+-------+-----------------------------------+-----------------+---------+