<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # [控制器](http://codeigniter.org.cn/user_guide/general/controllers.html#id13) 控制器是你整個應用的核心,因為它們決定了 HTTP 請求將被如何處理。 **目錄** [TOC=2,2] ## 什么是控制器? **簡單來說,控制器就是一個類文件,它的命名和 URI 有著一定的聯系。** 考慮下面的 URL ~~~ example.com/index.php/blog/ ~~~ 上例中,CodeIgniter 將會嘗試查詢一個名為 Blog.php 的控制器并加載它。 **當控制器的名稱和 URI 的第一段匹配上時,它將會被加載。** ## 讓我們試試看:Hello World! 接下來你會看到如何創建一個簡單的控制器,打開你的文本編輯器,新建一個文件 Blog.php , 然后放入以下代碼: ~~~ <?php class Blog extends CI_Controller { public function index() { echo 'Hello World!'; } } ~~~ 然后將文件保存到?application/controllers/?目錄下。 >[danger] 重要 > 文件名必須是大寫字母開頭,如:'Blog.php' 。 現在使用類似下面的 URL 來訪問你的站點: ~~~ example.com/index.php/blog/ ~~~ 如果一切正常,你將看到: > Hello World! >[danger] 重要 > 類名必須以大寫字母開頭。 這是有效的: ~~~ <?php class Blog extends CI_Controller { } ~~~ 這是無效的: ~~~ <?php class blog extends CI_Controller { } ~~~ 另外,一定要確保你的控制器繼承了父控制器類,這樣它才能使用父類的方法。 ## 方法 上例中,方法名為?index()?。"index" 方法總是在 URI 的?**第二段**?為空時被調用。 另一種顯示 "Hello World" 消息的方法是: ~~~ example.com/index.php/blog/index/ ~~~ **URI 中的第二段用于決定調用控制器中的哪個方法。** 讓我們試一下,向你的控制器添加一個新的方法: ~~~ <?php class Blog extends CI_Controller { public function index() { echo 'Hello World!'; } public function comments() { echo 'Look at this!'; } } ~~~ 現在,通過下面的 URL 來調用 comments 方法: ~~~ example.com/index.php/blog/comments/ ~~~ 你應該能看到你的新消息了。 ## 通過 URI 分段向你的方法傳遞參數 如果你的 URI 多于兩個段,多余的段將作為參數傳遞到你的方法中。 例如,假設你的 URI 是這樣: ~~~ example.com/index.php/products/shoes/sandals/123 ~~~ 你的方法將會收到第三段和第四段兩個參數("sandals" 和 "123"): ~~~ <?php class Products extends CI_Controller { public function shoes($sandals, $id) { echo $sandals; echo $id; } } ~~~ >[danger] 重要 > 如果你使用了?[URI 路由](http://codeigniter.org.cn/user_guide/general/routing.html)?,傳遞到你的方法的參數將是路由后的參數。 ## 定義默認控制器 CodeIgniter 可以設置一個默認的控制器,當 URI 沒有分段參數時加載,譬如當用戶直接訪問你網站的首頁時。 打開?**application/config/routes.php**文件,通過下面的參數指定一個默認的控制器: ~~~ $route['default_controller'] = 'blog'; ~~~ 其中,Blog 是你想加載的控制器類名,如果你現在通過不帶任何參數的 index.php 訪問你的站點,你將看到你的 Hello World 消息。 ## 重映射方法 正如上文所說,URI 的第二段通常決定控制器的哪個方法被調用。CodeIgniter 允許你使用?_remap()?方法來重寫該規則: ~~~ public function _remap() { // Some code here... } ~~~ >[danger] 重要 > 如果你的控制包含一個 _remap() 方法,那么無論 URI 中包含什么參數時都會調用該方法。 它允許你定義你自己的路由規則,重寫默認的使用 URI 中的分段來決定調用哪個方法這種行為。 被重寫的方法(通常是 URI 的第二段)將被作為參數傳遞到?_remap()?方法: ~~~ public function _remap($method) { if ($method === 'some_method') { $this->$method(); } else { $this->default_method(); } } ~~~ 方法名之后的所有其他段將作為?_remap()?方法的第二個參數,它是可選的。這個參數可以使用 PHP 的?[call_user_func_array()](http://php.net/call_user_func_array)?函數來模擬 CodeIgniter 的默認行為。 例如: ~~~ public function _remap($method, $params = array()) { $method = 'process_'.$method; if (method_exists($this, $method)) { return call_user_func_array(array($this, $method), $params); } show_404(); } ~~~ ## 處理輸出 CodeIgniter 有一個輸出類,它可以自動的將最終數據發送到你的瀏覽器。 更多信息可以閱讀?[視圖](http://codeigniter.org.cn/user_guide/general/views.html)?和?[輸出類](http://codeigniter.org.cn/user_guide/libraries/output.html)?頁面。但是,有時候, 你可能希望對最終的數據進行某種方式的后處理,然后你自己手工發送到瀏覽器。CodeIgniter 允許你向你的控制器中添加一個?_output()?方法,該方法可以接受最終的輸出數據。 >[danger] 重要 > 如果你的控制器含有一個?_output()?方法,輸出類將會調用該方法來顯示數據, 而不是直接顯示數據。該方法的第一個參數包含了最終輸出的數據。 這里是個例子: ~~~ public function _output($output) { echo $output; } ~~~ >[info] 注解 > 請注意,當數據傳到?_output()?方法時,數據已經是最終狀態。這時基準測試和計算內存占用都已經完成, 緩存文件也已經寫到文件(如果你開啟緩存的話),HTTP 頭也已經發送(如果用到了該?[特性](http://codeigniter.org.cn/user_guide/libraries/output.html))。 為了使你的控制器能正確處理緩存,_output()?可以這樣寫: ~~~ if ($this->output->cache_expiration > 0) { $this->output->_write_cache($output); } ~~~ 如果你在使用?_output()?時,希望獲取頁面執行時間和內存占用情況,結果可能會不準確, 因為并沒有統計你后加的處理代碼。另一個可選的方法是在所有最終輸出?之前?來進行處理, 請參閱?[輸出類](http://codeigniter.org.cn/user_guide/libraries/output.html)?。 ## 私有方法 有時候你可能希望某些方法不能被公開訪問,要實現這點,只要簡單的將方法聲明為 private 或 protected , 這樣這個方法就不能被 URL 訪問到了。例如,如果你有一個下面這個方法: ~~~ private function _utility() { // some code } ~~~ 使用下面的 URL 嘗試訪問它,你會發現是無法訪問的: ~~~ example.com/index.php/blog/_utility/ ~~~ >[info] 注解 > 為了向后兼容原有的功能,在方法名前加上一個下劃線前綴也可以讓該方法無法訪問。 ## 將控制器放入子目錄中 如果你正在構建一個比較大的應用,那么將控制器放到子目錄下進行組織可能會方便一點。CodeIgniter 也可以實現這一點。 你只需要簡單的在?application/controllers/?目錄下創建新的目錄,并將控制器類放到子目錄下。 注解 當使用該功能時,URI 的第一段必須制定目錄,例如,假設你在如下位置有一個控制器: ~~~ application/controllers/products/Shoes.php ~~~ 為了調用該控制器,你的 URI 應該像下面這樣: ~~~ example.com/index.php/products/shoes/show/123 ~~~ 每個子目錄下都應該包含一個默認控制器,這樣當 URL 中只有子目錄路徑時將會調用它。你可以在?application/config/routes.php?文件中配置默認控制器。 你也可以使用 CodeIgniter 的?[URI 路由](http://codeigniter.org.cn/user_guide/general/routing.html)?功能 來重定向 URI 。 ## 構造函數 如果你打算在你的控制器中使用構造函數,你?**必須**?將下面這行代碼放在里面: ~~~ parent::__construct(); ~~~ 原因是你的構造函數將會覆蓋父類的構造函數,所以我們要手工的調用它。 例如: ~~~ <?php class Blog extends CI_Controller { public function __construct() { parent::__construct(); // Your own constructor code } } ~~~ 如果你需要在你的類被初始化時設置一些默認值,或者進行一些默認處理,構造函數將很有用。 構造函數沒有返回值,但是可以執行一些默認操作。 ## 保留方法名 因為你的控制器將繼承主程序的控制器,在新建方法時你必須要小心不要使用和父類一樣的方法名, 要不然你的方法將覆蓋它們,參見?[保留名稱](http://codeigniter.org.cn/user_guide/general/reserved_names.html)?。 >[danger] 重要 > 另外,你也絕對不要新建一個和類名稱一樣的方法。如果你這樣做了,而且你的控制器 又沒有一個?__construct()?構造函數,那么這個和類名同名的方法?Index::index()?將會作為類的構造函數被執行!這個是 PHP4 的向前兼容的一個特性。 ## 就這樣了! OK,總的來說,這就是關于控制器的所有內容了。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看