因為升級成 Codeignitor4(以下全稱為ci4) 加上習慣使用 smarty4,因此在 view表上決定使用 smarty4(以下皆稱smarty)。
程式碼來源於[1],有小部分修改。
異動的檔案有三個,在app/目錄下
├── Config
│ ├── Services.php <== 註記服務
├── Libraries
│ └── CI4Smarty.php <== 叫用smarty物件
├── ThirdParty
└── smarty <== smarty4裝在這裡
...
└── libs
├── Autoloader.php <== 讀取此檔即可
在writable/目錄下建立兩個可寫入的目錄
└── writable
├── cache
├── templates_c
├── cache
├── templates_c
Config/Services.php
<?php namespace Config; use CodeIgniter\Config\Services as CoreServices; use CodeIgniter\Config\BaseConfig; use Config\App; use App\Libraries\CI4Smarty; require_once SYSTEMPATH . 'Config/Services.php'; class Services extends CoreServices { public static function SmartyEngine($getShared = true){ return ($getShared === true ? static::getSharedInstance('SmartyEngine') : new CI4Smarty()); } };
Libraries/CI4Smarty.php
<?php namespace App\Libraries; require_once APPPATH.'ThirdParty/smarty/libs/Autoloader.php'; use \Smarty_Autoloader; Smarty_Autoloader::register(); use \Smarty; class CI4Smarty extends Smarty { public function __construct() { parent::__construct(); parent::setTemplateDir(APPPATH . 'Views/'); parent::setCompileDir(WRITEPATH . 'templates_c/')->setCacheDir(WRITEPATH . 'cache/'); parent::setLeftDelimiter('{{'); parent::setRightDelimiter('}}'); } public function view($tpl_name) { parent::display($tpl_name); } }
設定寫入暫存檔目錄及cache,同時設定smart標記左右符號。
Controller 中叫用
service('SmartyEngine')->assign('ip',$ip)->assign('isipv6', $isipv6); service('SmartyEngine')->view('smarty_template.tpl');
SmartyEngine 預設採用靜態方式載入,如果想要創建新的 SmartyEngine,可寫成:
service('SmartyEngine',false);
結論是透過網友的幫忙,smarty+ci4 整合的不錯,也不難,祝大家使用愉快。