CakePHP 2.x CookBook 中文版 第五章 控制器 之 組件_PHP教程

來源:互聯網
上載者:User
組件組件是在多個控制器中共用的邏輯包。如果人發現自己想要在控制器間複製粘貼某些東西時,你就應該考慮將一些功能封裝在一個組件中了。 CakePHP 還配備了一套漂亮的、對你有用的核心組件: Security(安全)Sessions(會話)Access control lists(存取控制清單)Emails(電子郵件)CookiesAuthentication(許可權校正)Request handling(請求處理)Pagination(分頁)這些組件的詳細資料都在各自的章節中。 現在,我們將向你展示如何建立你自己的組件。 建立組件可以保持控制器代碼整潔,並且允許你在多重專案中重用代碼。 配置組件一些核心組件需要配置。需要配置的組件有 授權、 Cookie 和 電子郵件組件 等。 對於一般的組件,通常在$components 數組或者控制器的 beforeFilter 方法中進行配置: 1 class PostsController extends AppController {2 public $components = array(3 'Auth' => array(4 'authorize' => array('controller'),5 'loginAction' => array('controller' => 'users', 'action' => 'login')6 ),7 'Cookie' => array('name' => 'CookieMonster')8 );這是使用 $components 數組配置組件的例子。所有的核心組件都允許使用這種方式進行配置。此外,你也可以在控制器的 beforeFilter() 方法中配置組件。 這種方式通常用在你需要將一個函數的結果賦與一個組件屬性的情況下。上面的例子還可以表示成: 1 public function beforeFilter() {2 $this->Auth->authorize = array('controller');3 $this->Auth->loginAction = array('controller' => 'users', 'action' => 'login');4 5 $this->Cookie->name = 'CookieMonster';6 }然而,也有這種可能:一個組件的特定配置選項要在控制器的 beforeFilter() 運行前設定。 最後,一些組件允許在$components 數組中設定配置選項: 1 public $components = array(2 'DebugKit.Toolbar' => array('panels' => array('history', 'session'))3 );通過查閱相關文檔可以確定每個組件都提供哪些配置選項。 className 是一個公用的設定選項,你可以藉此給組件起個別名。當你想要用自訂的實現替換 $this->Auth 或者其它公用群組件時,這個選項非常有用。 1 // app/Controller/PostsController.php 2 class PostsController extends AppController { 3 public $components = array( 4 'Auth' => array( 5 'className' => 'MyAuth' 6 ) 7 ); 8 } 9 10 // app/Controller/Component/MyAuthComponent.php11 App::uses('AuthComponent', 'Controller/Component');12 class MyAuthComponent extends AuthComponent {13 // Add your code to override the core AuthComponent14 }上例的控制器中 $this->Auth 的別名為 MyAuthComponent 。 註解 在任何用到有別名的組件時,都要使用別名,包括在其它組件內引用。 使用組件一旦你已經在控制器中包含了一些組件,用起來是非常簡單的。在控制器中每個元件都以屬性的方式使用。如果你已經在控制器中載入了 SessionComponent 和 the CookieComponent ,你就可以像下面這樣訪問它們: 1 class PostsController extends AppController {2 public $components = array('Session', 'Cookie');3 4 public function delete() {5 if ($this->Post->delete($this->request->data('Post.id')) {6 $this->Session->setFlash('Post deleted.');7 $this->redirect(array('action' => 'index'));8 }9 }註解 由於以屬性身份加入到控制器中的模型和組件共用相同的 ‘命名空間’,你需要確保不給組件和模型相同的命名。 運行中載入組件你也許不需要所有的組件在每個控制器方法中都可用。 這種情況下,你可以在運行時使用 Component Collection 載入一個組件。 在控制器內部,你可以按如下方式進行: 1 $this->OneTimer = $this->Components->load('OneTimer');2 $this->OneTimer->getTime();組件回調 組件也提供一些請求生命週期回調,以允許它們延伸請求周期。 有關組件提供的回調的更詳細資料,請參閱 組件 API。 建立組件假定我們的線上應用程式需要在其不同部分運行一個複雜的數學操作。我們可以建立一個組件封裝這個用在幾個不同控制器中的共用邏輯。 第一步是新的組件檔案和類。建立的檔案為 /app/Controller/Component/MathComponent.php。其基本結構如下: 1 App::uses('Component', 'Controller');2 class MathComponent extends Component {3 public function doComplexOperation($amount1, $amount2) {4 return $amount1 + $amount2;5 }6 }註解 所有的組件必須繼承 Component。否則就會引發一個異常。 在控制器中包含組件一旦組件完成,就可以通過將組件名稱放進控制器的 $components 數組的方式在應用程式控制器中使用它了(參見 “組件” 部分)。控制器將自動提供一個用組件命名的新屬性,通過這個屬性我們可以訪問組件的執行個體: 1 /* 產生一個新的組件變數 $this->Math2 和一個標準的 $this->Session */3 public $components = array('Math', 'Session');定義在 AppController 中的組件將與其它控制器中的組件合并。因此不需要二次定義相同的組件。 在控制器中包含組件時,你還可以定義一組參數傳遞給組件的建構函式。這些參數隨後將被組件處理: 1 public $components = array(2 'Math' => array(3 'precision' => 2,4 'randomGenerator' => 'srand'5 ),6 'Session', 'Auth'7 );這段代碼將包含了 precision 和 randomGenerator 的數組作為第二個參數傳遞給了 MathComponent::__construct()。根據約定,任何在組件上被傳遞的公用屬性也將擁有基於此設定的值。 在組件中使用其它組件有時一個組件還需要使用其它組件。在這種情況下,你可以使用與在控制器中包含組件相同的方式,在一個組件中包含另一個組件 - 使用 ``$components` 變數: 1 // app/Controller/Component/CustomComponent.php 2 App::uses('Component', 'Controller'); 3 class CustomComponent extends Component { 4 // the other component your component uses 5 public $components = array('Existing'); 6 7 public function initialize(Controller $controller) { 8 $this->Existing->foo(); 9 }10 11 public function bar() {12 // ...13 }14 }15 16 // app/Controller/Component/ExistingComponent.php17 App::uses('Component', 'Controller');18 class ExistingComponent extends Component {19 20 public function foo() {21 // ...22 }23 }組件 API class Component組件基類為通過 ComponentCollection 消極式載入其它組件以及處理公用設定提供了幾個方法。它還為所有的組件回調提供了屬性。 Component::__construct(ComponentCollection $collection, $settings = array())組件基類建構函式。作為公用屬性的所有 $settings 也將有與 settings 內設定的值匹配的值。 回調www.2cto.comComponent::initialize(Controller $controller)initialize 方法在控制器的 beforeFilter 方法之前被調用。 Component::startup(Controller $controller)startup 方法在控制器的 beforeFilter 之後但在控制器執行當前動作處理之前被調用。 Component::beforeRender(Controller $controller)beforeRender 方法在執行請求動作邏輯之後,控制器渲染視圖和布局之前被調用。 Component::shutdown(Controller $controller)shutdown 方法在輸出傳送給瀏覽器之前被調用。 Component::beforeRedirect(Controller $controller, $url, $status=null, $exit=true)beforeRedirect 方法在控制器跳轉方法被調用之後,所有其它方法調用之前被調用。如果這個方法返回假,將不再繼續完成請求的轉向。$url、$status 和 $exit 變數對於控制器方法的意義相同。你還能返回一個字串,作為轉向的 url,或者返回帶有鍵 ‘url’ 的關聯陣列,此數組的 ‘status’ 和 ‘exit’ 元素是可選的。

http://www.bkjia.com/PHPjc/477792.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/477792.htmlTechArticle組件 組件是在多個控制器中共用的邏輯包。如果人發現自己想要在控制器間複製粘貼某些東西時,你就應該考慮將一些功能封裝在一個組件...

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.