【小(xiǎo)編推薦】ThinkPHP3.2——控制(zhì)器(q₽₩ì)定義

2014-06-26   | ™←;  發布者:梁國(guó)芳  ♥φ |   查看(kàn):3320次£↓≤

Thinkphp

控制(zhì)器(qì)和(hé)操作(zuò)

一(yī)般來(lái)說(shuō),ThinkPHP的(♦←‍de)控制(zhì)器(qì)是(shì)一∑σ(yī)個(gè)類,而操作(zuò)則是(shì)控制₽δ®(zhì)器(qì)類的(de)一(yī)個(gè←"α )公共方法

下(xià)面就(jiù)是(shì)一(yī)個(gè)<δ₹典型的(de)控制(zhì)器(qì)類的(de)定義:γεσ​

  1. php
  2. namespace Home\Controller;
  3. use Think\Controller;
  4. class IndexController extends Controller {
  5. public function hello(){
  6. echo 'hello,thinkphp!';
  7. }
  8. }

Home\IndexController類就(jiù)代表了(le)Home模塊£σ下(xià)的(de)Index控制(zhì)↔↓←≠器(qì),而hello操作(zuò)就(jiù)是(shì)Home\IndexController類的(de)hello(公共)方法。

當訪問(wèn) http://serverName/index.php/Home/Indexα↓¶/hello 後會(huì)輸出:

  1. hello,thinkphp!

注意:如(rú)果你(nǐ)設置了(le)操作(zuò)方法綁定到§♥(dào)類,則操作(zuò)方法對(duì)應了(le)•↑一(yī)個(gè)類。

定義控制(zhì)器(qì)

控制(zhì)器(qì)通(tōng)常需要(yào)繼承系統的(de)Cα££≤ontroller類或者其子(zǐ)類,例如(rú),下(xià)面定γφ義了(le)一(yī)個(gè) \Home\Controller\IndexCo↑§ntroller 控制(zhì)器(qì)類:

  1. php
  2. namespace Home\Controller;
  3. use Think\Controller;
  4. class IndexController extends Controller {
  5. public function hello(){
  6. echo 'hello';
  7. }
  8.  
  9. public function test(){
  10. echo 'test';
  11. }
  12. }

控制(zhì)器(qì)的(de)名稱采用(yòng)駝峰法命名(首字‍♦ 母大(dà)寫),控制(zhì)器(qì)文(wén)件(jià¥←Ωn)位于 Home/Controller/IndexController.class.p"‌hp

IndexController控制(zhì)器(qì)類∞¶的(de)hello和(hé)test方法就(jiù)是(shì)©‍操作(zuò)方法,訪問(wèn)下(xià)面₹™♠的(de)URL地(dì)址:

  1. http://serverName/Home/Index/hello
  2. http://serverName/Home/Index/test∏¥↕

會(huì)分(fēn)别輸出:

  1. hello
  2. // 和(hé)
  3. test

操作(zuò)方法的(de)定義必須是(shì)公共方≤λ法,否則會(huì)報(bào)操作(zu<>ò)錯(cuò)誤,所以,下(xià)面的(de)操作(zuò)定義隻能(né™  βng)訪問(wèn)hello操作(zu< ↓λò),而不(bù)能(néng)訪問(wèn)test操作(zuò)​β€β。

  1. php
  2. namespace Home\Controller;
  3. use Think\Controller;
  4. class IndexController extends Controller {
  5. public function hello(){
  6. echo 'hello';
  7. }
  8.  
  9. protected function test(){
  10. echo 'test';
  11. }
  12. }

因為(wèi)操作(zuò)方法就(jiù)是(sh ¥®ì)控制(zhì)器(qì)的(de)一(y¥₹σ♣ī)個(gè)方法,所以遇到(dào)有(yǒu)和(hé)系統的(de)§λγ關鍵字沖突的(de)方法可(kě)能(n'≈∏≈éng)就(jiù)不(bù)能(néng)定義了(le),這(zhè)個€ (gè)時(shí)候我們可(kě)以設置操 ‍≠作(zuò)方法的(de)後綴來(lái)解決¶γ,例如(rú):

  1. 'ACTION_SUFFIX' => 'Action', // 操作(zuò)方法後綴

設置操作(zuò)方法的(de)後綴為(wèi)Act☆→≠ ion,這(zhè)樣,控制(zhì)器(qì)的★≤≠σ(de)操作(zuò)方法定義調整為(wèi):

  1. php
  2. namespace Home\Controller;
  3. use Think\Controller;
  4. class IndexController extends Controller {
  5. public function listAction(){
  6. echo 'list';
  7. }
  8.  
  9. public function helloAction(){
  10. echo 'hello';
  11. }
  12.  
  13. public function testAction(){
  14. echo 'test';
  15. }
  16. }

操作(zuò)方法的(de)後綴設置隻是(shì)影(yǐng)響控制(zhìδ∏)器(qì)類的(de)定義,對(duì)URL訪問(wèn)沒有(yǒ♣Ω∞<u)影(yǐng)響。

多(duō)層控制(zhì)器(qì)

ThinkPHP的(de)控制(zhì)器(qì)支持多(duō)層和↓ (hé)多(duō)級,多(duō)層指的(de)是(shì)控制•♠(zhì)器(qì)可(kě)以分(fēn)層σ€€÷,例如(rú)除了(le)默認的(de)Controller控≤→♥‍制(zhì)器(qì)層(我們可(kě)以稱之為(wèi)訪問(wèn)控制(•♠zhì)器(qì)),還(hái)可(kě)以添加事(shì)件(jiànσ☆&)控制(zhì)器(qì)(層),例如(rú):

  1. ├─Controller 訪問(wèn)控制(zhì)器(qì)
  2. ├─UserController.class.php
  3. ├─BlogController.class.php
  4. ...
  5. ├─Event 事(shì)件(jiàn)控制(zhì)器(qì)
  6. ├─UserEvent.class.php
  7. ├─BlogEvent.class.php
  8. ...

訪問(wèn)控制(zhì)器(qì)的(de)名稱是(shì)通(tōng$π≠₩)過DEFAULT_C_LAYER設置的(de),默認是(shì)Control≤×ler。

訪問(wèn)控制(zhì)器(qì)負責外(wài)部交<↓"互響應,通(tōng)過URL請(qǐng)求響♥δ應,例如(rú) http://serverName/Home/User/index,而事(shì)件(jiàn)控制(zhì)器(qì)負©♠•→責內(nèi)部的(de)事(shì)件(jiàn)<±₽→響應,并且隻能(néng)在內(nèi)部調用(yòng),所以是×↓÷(shì)和(hé)外(wài)部隔離(lí)的(de)。

多(duō)層控制(zhì)器(qì)的(de)劃分(fēn)•Ω•&可(kě)以根據項目的(de)需要(yào)自(zì)由分(fēn∑δ‌©)層。

如(rú)果是(shì)定義其他(tā)的(d¥₩↑‌e)控制(zhì)器(qì)層,則不(bù)一∏↕→±(yī)定必須要(yào)繼承系統的(de)Controller類♥€或其子(zǐ)類,通(tōng)常需要(yà∏Ω‍o)輸出模版的(de)時(shí)候才需要(yε∞↔©ào)繼承Controller類。例如(rú):

  1. php
  2. namespace Home\Event;
  3. class UserEvent {
  4. public function login(){
  5. echo 'login event';
  6. }
  7.  
  8. public function logout(){
  9. echo 'logout event';
  10. }
  11. }

UserEvent事(shì)件(jiàn)控制(zhì)器(Ω∑qì)位于 Home/Event/UserEvent.class.php

多(duō)級控制(zhì)器(qì)

多(duō)級控制(zhì)器(qì)是(shì)指控®&≈制(zhì)器(qì)可(kě)以通(tō ♦♦λng)過子(zǐ)目錄把某個(gè)控制(zhì §β)器(qì)層分(fēn)組存放(fàng),首•¶先需要(yào)設置控制(zhì)器(qì)的(de)分(fēn←×★α)級層次,例如(rú),我們設置2級目錄☆δ的(de)控制(zhì)器(qì)層:

  1. 'CONTROLLER_LEVEL' => 2,

控制(zhì)器(qì)文(wén)件(jiàn)的(de∞★)位置放(fàng)置如(rú)下(xià):

  1. ├─Controller 訪問(wèn)控制(zhì)器(qì)
  2. ├─User User分(fēn)級(組)
  3. ├─UserTypeController.class.php
  4. ├─UserAuthController.class.php
  5. ...
  6. ├─Admin Admin分(fēn)級(組)
  7. ├─UserController.class.php
  8. ├─ConfigController.class.php
  9. ...

多(duō)級控制(zhì)器(qì)中的(de)命名空(kōng)間(jiā≠×™n)需要(yào)這(zhè)樣定義:

  1. php
  2. namespace Home\Controller\Admin;
  3. use Think\Controller;
  4. class IndexController extends Controller {
  5. public function hello(){
  6. echo 'hello';
  7. }
  8.  
  9. public function test(){
  10. echo 'test';
  11. }
  12. }

然後就(jiù)可(kě)以通(tōng)過←✘σURL地(dì)址訪問(wèn):

  1. http://serverName/Home/User/UserTy™ ↕'pe
  2. http://serverName/Home/Admin/User☆ε£★

如(rú)果希望簡化(huà)URL地(dì)≠∏≈±址中的(de)模塊地(dì)址,可(kě)以參考模塊部署

實例化(huà)控制(zhì)器(qì)

訪問(wèn)控制(zhì)器(qì)的(d≈₹∑e)實例化(huà)通(tōng)常是(shì)自(zα£ì)動完成的(de),系統會(huì)根據URL地(dì)址解析出訪問(w​×¶èn)的(de)控制(zhì)器(qì)名稱自(z'✔ì)動實例化(huà),并且調用(yòng)相(xiàng)關的(de) $操作(zuò)方法。

如(rú)果你(nǐ)需要(yào)跨控制(zhì)器(∞₽§€qì)調用(yòng)的(de)話(huà),則可(kě)以單獨實例化(←♥huà):

  1. // 實例化(huà)Home模塊的(d•↕×εe)User控制(zhì)器(qì)
  2. $User = new \Home\Controller\UserC×<ontroller();
  3. // 實例化(huà)Admin模塊的(de)Blog控制→×✔(zhì)器(qì)
  4. $Blog = new \Admin\Controller\Bl¶£≥↔ogController();

系統為(wèi)上(shàng)面的(de)控♥₩>制(zhì)器(qì)實例化(huà)提供了(le)一(®‌↓yī)個(gè)快(kuài)捷調用(yòn↓€∏g)方法A,上(shàng)面的(de)代碼可(kě)以簡化(huà)為(wè&₩™i):

  1. // 假設當前模塊是(shì)Home模塊
  2. $User = A('User');
  3. $Blog = A('Admin/Blog');

默認情況下(xià),A方法實例化(huà)的(de)是(shì)默認控制(z∞£ ©hì)器(qì)層(Controller)∏♣§Ω,如(rú)果你(nǐ)要(yào)實例化(huà)★®其他(tā)的(de)分(fēn)層控制 Ω ≤(zhì)器(qì)的(de)話(huà),可(kě)以使用(y₹₩òng):

  1. // 假設當前模塊是(shì)Home模塊
  2. // 實例化(huà)Event控制(zhì)器(qì​&♦)
  3. $User = A('User','Event');
  4. $Blog = A('Admin/Blog','Event');

上(shàng)面的(de)代碼等效于:

  1. // 實例化(huà)Home模塊的(de)Us‍↕er事(shì)件(jiàn)控制(zhì)器(qì)
  2. $User = new \Home\Event\UserEvent();
  3. // 實例化(huà)Admin模塊的(α ¶de)Blog事(shì)件(jiàn)控制(zhì)器(q‌αì)
  4. $Blog = new \Admin\Event\BlogEvent();