許多 CMS 系統需要支持「換膚」功能,即通過配置切換前端模板集。Laravel 預設 View::make('index.index') 固定路徑,本文演示如何優雅實現主題機制,並解決子主題缺失模板時自動回退默認主題的問題。
將模板按主題名組織目錄:
resources/views/
default/
index/index.blade.php
custom/
index/index.blade.php
渲染時動態拼接 theme.view.path。
function index() {
$theme = Config::get('app.theme', 'default');
return View::make("{$theme}.index.index");
}
缺點:自定義主題必須包含所有模板,否則報錯。
function index() {
$theme = Config::get('app.theme', 'default');
$tpl = "{$theme}.index.index";
if (!View::exists($tpl)) {
$tpl = "default.index.index";
}
return View::make($tpl);
}
優點:子主題只需覆蓋差異模板,其餘自動繼承默認主題。
在 App\Providers\AppServiceProvider 的 boot() 中註冊:
Response::macro('render', function ($path, $data = []) {
$theme = Config::get('app.theme', 'default');
$tpl = "{$theme}.{$path}";
if (!View::exists($tpl)) {
$tpl = "default.{$path}";
}
return Response::view($tpl, $data);
});
控制器中調用:
function index() {
return Response::render('index.index', ['title' => '首頁']);
}
注意:模板變量必須通過第二個參數傳遞。
View::composer 自動注入全局變量(如當前主題名)。asset() 輔助函數動態生成路徑。這套方案零侵入核心,僅利用 Laravel 內置 View 查找機制,適合中小型專案快速接入主題系統。