>[info]從上節課iWebShop的運行機制知道,初始化之后,第一個運行的部件就是控制器Controller, 這一節課就說明Controller的用法。
## 一、URL解析
上節講到,iWebCore 接受用戶的請求之后,URLManager會對URL進行分析,找到指定的控制器的一個Action運行程序。以下通過一個請求來說明如何解析的。
>[info]如請求為:http://域名/index.php?controller=site&action=products&id=9
>
>>[danger]index.php為統一口文件
>>
>>controller=site&action=products 表示請求的是控制器site下的products函數
>>
>>id=9為傳遞參數,由action接收
那么,我們怎么知道這個請求執行了什么?先依次從controllers下找到文件site.php,打開文件找到function products,以上請求解析完成之后執行的就是這個函數,在這個函數中能看到獲取了傳遞參數為id, 之后就是業務邏輯。

products執行之后,顯示商品頁面如下:

## 二、控制器的規則
* 控制器的PHP文件必須放在controllers下,文件名都用小寫字母,不要包含其他字符
* 控制器就是一個類,這個類必須要繼承IController,類名的第一個字母要大寫
* 類名和文件名要保持一致
~~~
class Site extends IController
{
function init()
{
//初始化代碼
}
function xxxx{
//運行的程序代碼
}
}
~~~
* 每個類都有一個init方法,如上,在對象初始化時執行。
* 控制器的開發遵循PHP面向對象的原則,一切PHP面向對象的規則都支持。
## 三、控制器實例
在controllers目錄下建一個文件test.php,代碼如下:
~~~
<?php
class Test extends IController
{
public function helloworld(){
echo "hello world";
}
}
?>
~~~
運行得到的結果如下:

## 四、如何給模板渲染數據
一共有 2 種方法可以把控制器里面的數據傳遞給模板,可以通過【類屬性】和【$this->setRenderData】
~~~
function show()
{
$this->title="123456";//類屬性
$this->setRenderData(array('title'=>'123456'));//setRenderData
$this->redirect("show");//跳轉到控制器模板文件show中
}
~~~
第一行**【推薦】**:展示了第一種傳值方式,通過類屬性賦值操作,把字符串“1234567”賦值給了 $this->title
第二行: 展示了第二種傳值方式, 通過控制器自身方法 setRenderData 把參數數組里面的鍵變成模板里面的變量
第三行:把視圖引入進來, 引入控制器下的 show.html
>[danger]注意:如果要給視圖渲染數據那么要引入的視圖名字必須和 action 方法名字相同,即function方法名字叫 show,要顯示的視圖也必須叫 show。
當然如果方法名稱和視圖名稱不一致卻仍想渲染數據,需要在最后的 redirect方法中增加第二個參數——false 比如要把$this->title傳遞給 test1.html 視圖,那么第三行就要寫成: $this->redirect(‘test1’,false); 此時就可以實現顯示 test1.html,并且帶著 show方法里面的數據了
>[info]模板文件可以直接通過以下方式來顯示數據
~~~
<h2>$this->title</h2>
<h3>$title</h3>
~~~
>[warning]如有不明白的地方,留言或是加入我們?“三眾技術QQ交流群”一起討論
## 關于我們
>[danger][三眾科技](http://www.sunzoon.com)資訊平臺——大道至簡,悅你所閱!
>本教程由[三眾簡悅](http://it.sunzoon.com)原創,轉載請注明出處,作者:bobball,由bobo整理成看云書籍
三眾技術交流群:**543102562**
歡迎大家加入我們,共同討論IT,互聯網技術。同時可以掃描下面的二維碼關注我們,謝謝!
