php – Joomla! 前後台元件 (Component) 共用 Model 的方法
Joomla! 的元件 (Component) 在前後台算是各自獨立,而 MVC 架構更是前後台分離。也就是如果前台的 Controller 要使用後台的 Model 該怎麼辦呢?會有這個需求,主要是解決避免重複造輪子。例如
- 前台:會員發佈文章,需要寫入資料表 Article 欄位 title, content, user_id
- 後台:管理員可以手動發佈文章,需要寫入資料表 Article 欄位 title, content, user_id
我們發現同一件事情,寫入資料表欄位 這個動作,通常我們會在前台、後台的 Model 都要各做一次一模一樣的方法。
class MyModelArticle extends JModelLegacy { public function insert() { // 寫入動作...... } }
我們要如何統一寫一次就好,讓這個 insert() 可以被前後台都使用呢?
用範例解決方式
我建議將元件 Component 的 Model 部分,集中在後台 MVC 架構裡。前台的 MVC 架構,不要放任何的 Model。這樣可以更方便維護,日後前台、後台只要動到跟資料庫有關的行為,一律到後台的 Model 尋找。
- Component 名稱 com_my
- Controller 名稱 MyControllerArticle
- Model 名稱 MyModelArticle
後台控制器
取得 Model 的方法不用做任何改寫。
class MyControllerArticle extends JControllerLegacy { function __construct($config = array()) { parent::__construct($config); $this->article_model = $this->getModel('Article'); } // 寫入 public function query_insert() { $this->article_model->insert(); } }
前台控制器
因為前台沒有 Model 了,我們要用 JModelLegacy::addIncludePath() 取得後台的 Model,然後仍然可以維持使用 getModel() 的方法。
class MyControllerArticle extends JControllerLegacy { function __construct($config = array()) { parent::__construct($config); JModelLegacy::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_my/models'); $this->store_model = $this->getModel('Article') or die("Invalid Load Model"); } // 寫入 public function query_insert() { $this->article_model->insert(); } }
當前後台都改用這種方式運作,我們維護與資料表 Article 的行為,就可以統一集中在後台的 Model 囉。