php – Joomla! – 如何設計共用的 Controller 做預處理
不管是不同 Component 下的 Controller,或是同個 Component 底下的 Controller,很多時候我們需要每個 Controller 都得處理共用程序,而不打算每次開新的 Controller 就要從寫一次
例如這個 $input,我可不想每次寫 Controller 都還要寫一次
1 2 3 4 |
$input = \JFactory::getApplication()->input; echo $input->post->getString('task'); |
我希望每次寫 Controller 只需要
1 2 3 |
$this->post->getString('task'); |
或是有個 Model 因為太常使用,我們卻每個 Controller 都要載入
1 2 3 |
$this->something_model = $this->getModel('something') or die("Invalid Load Model"); |
我們可能會很希望直接在 controller::method() 中直接使用
1 2 3 |
$somethings = $this->somethings_model->getAll(); |
這樣該如何製作?
其實只要透過 plugins 的方式就可以達到,可以先參考這篇 如何自動載入類別庫或 composer 到全域 。我們依照這篇文章的 plugin 設計實做。
建立一個 Library
libraries/src/Jsnlib/Joomla/ControllerLegacy/Form.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<?php namespace Jsnlib\Joomla\ControllerLegacy; class Form extends \JControllerLegacy { protected $app; protected $input; protected $get; protected $post; function __construct($config = array()) { parent::__construct($config); $this->app = \JFactory::getApplication(); $this->input = $this->app->input; $this->get = $this->input->get; $this->post = $this->input->post; } } |
注意自動讀取的類別
這個類別如同這篇 如何自動載入類別庫或 composer 到全域 ,我們不需要修改
plugins/system/mylib/mylib.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<?php defined('_JEXEC') or die; class plgSystemMylib extends JPlugin { public function __construct(&$subject, $config) { parent::__construct($subject, $config); } public function onAfterInitialise() { // ...... // 這行注意要存在 JLoader::registerNamespace('Jsnlib', JPATH_LIBRARIES . '/src'); // ...... } } |
實際測試
元件 Component 注意繼承改為 extends \Jsnlib\Joomla\ControllerLegacy\Form。
components/com_todolist/controllers/form.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<?php defined('_JEXEC') or die; class TodoListControllerForm extends \Jsnlib\Joomla\ControllerLegacy\Form { function __construct($config = array()) { parent::__construct($config); } public function query_insert() { // 如預期顯示 echo $this->get->getString('task'); echo $this->post->getString('title'); die; } } |
接著我們如果覺得這樣取出 GET/POST 太囉嗦
1 2 3 4 |
$this->get->getString('task'); $this->post->getString('title'); |
我想更精簡這樣
1 2 3 4 5 6 7 |
$this->getString('task'); $this->getInt('id'); $this->postString('title'); $this->postString('description'); |
那就參考下一篇文章 如何在元件中快速取得 GET | POST 的方法。
Comments