CodeIgniter自定義控制器MY_Controller用法分析
本文實(shí)例講述了CodeIgniter自定義控制器MY_Controller用法。分享給大家供大家參考,具體如下:
Codeigniter所有的控制器都必須繼承CI_Controller類,但CI_Controller類位于system目錄下,不太方便修改。為方便做一些公用的處理,通常情況下我們會在core下創(chuàng)建MY_Controller,用來繼承CI_Controller,從而項(xiàng)目中所有的控制器繼承MY_Controller。
那么,MY_Controller 通常會做些什么呢?
所有的控制器都繼承了MY_Controller, MY_Controller常常會加載一些公用幫助函數(shù)、公用類庫,以及實(shí)現(xiàn)一些公用的方法。
公用的方法?公有的方法?
看到這些方法會意識到一個(gè)問題,如果方法是public的,那是否可以通過瀏覽器訪問到。答案是可以的!這樣不該讓用戶訪問到的方法讓用戶訪問到了。那設(shè)置protected吧。。。
備注:CI_Controller中寫public方法不會被訪問到,框架限制了CI_Controller中方法通過瀏覽器訪問。
隨著項(xiàng)目的不斷進(jìn)展,MY_Controller中的公用方法會越來越多。如果此時(shí)要增加后臺管理的功能,所有的控制器依然繼承MY_Controller,那其中的很多方法可能不適用了。如果后臺需要的一些公用方法也寫在這里,這里將會變得混亂。
如何按模塊區(qū)分不同的控制器?
有兩種處理的方式,第一種是通過不同的公用控制器文件來區(qū)分,由控制器去決定繼承哪一個(gè)公用控制器,當(dāng)然這里得引入公用文件。還有這種方式是可以通過對象的一個(gè)屬性來維護(hù),不同的模塊賦予該屬性不同的對象。如:
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); class MY_Controller extends CI_Controller { public function __construct($type = NULL) { parent::__construct(); switch($type) { case 'api' : $this->load->library('api_helper', NULL, 'helper'); break; case 'admin' : $this->load->library('admin_helper', NULL, 'helper'); break; default : $this->load->library('app_helper', NULL, 'helper'); break } } } /* End of file MY_Controller.php */ /* Location: ./application/core/MY_Controller.php */
控制器調(diào)用MY_Controller構(gòu)造函數(shù)并傳入type值,根據(jù)不同的type值會加載不同的類庫,然后給類定義一個(gè)統(tǒng)一的別名,方便處理。具體的library可以處理該模塊公用的方法或load公用的資源,相當(dāng)于該模塊的一個(gè)公用類。當(dāng)然處理方式也可以是直接通過路由中的目錄名或者控制器名稱來控制等等。
這樣避免了加載不同的文件,調(diào)用方法時(shí)只需要通過$this->helper對象調(diào)用。在仔細(xì)看看,可以發(fā)現(xiàn)不同模塊的公用類是放在library中,放在library或helper中都可以使用get_intance獲取控制器對象,但每次使用都需要獲取實(shí)例,相對麻煩,如果是模型呢?感覺也不太好。其中的公用方法有一些會跟業(yè)務(wù)邏輯相關(guān),放在library感覺不太合適。
業(yè)務(wù)邏輯好像并沒有一個(gè)好的地方去實(shí)現(xiàn),控制器的私有方法?模型?
先總結(jié)下上面的處理方法:
1、不同模塊之間可以按需加載以及實(shí)現(xiàn)自定義的公用方法,各個(gè)模塊之間互不影響。如果各模塊之間的公用方法比較多,也可以再去繼承一個(gè)公用的類。
2、公用方法放在library中,調(diào)用CI實(shí)例不方便。
3、如果不喜歡$this->herlper的調(diào)用方法,可以讓控制器去繼承不同的公用控制器,思路是一樣的,只是可能需要手動(dòng)引入文件。
更多關(guān)于CodeIgniter相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《codeigniter入門教程》和《CI(CodeIgniter)框架進(jìn)階教程》
希望本文所述對大家基于CodeIgniter框架的PHP程序設(shè)計(jì)有所幫助。
相關(guān)文章
PHP基于yii框架實(shí)現(xiàn)生成ICO圖標(biāo)
本文給大家分享了2則php生成ICO圖標(biāo)的代碼,第一款是基于YII框架實(shí)現(xiàn)的,第二款是純php編寫,都非常的不錯(cuò),有需要的小伙伴可以參考下2015-11-11ThinkPHP中pathinfo的訪問模式、路徑訪問模式及URL重寫總結(jié)
這篇文章主要介紹了ThinkPHP中pathinfo的訪問模式、路徑訪問模式及URL重寫總結(jié),是ThinkPHP路由訪問的基礎(chǔ)知識,在ThinkPHP開發(fā)中非常重要,需要的朋友可以參考下2014-08-08在Laravel5中正確設(shè)置文件權(quán)限的方法
這篇文章主要給大家介紹了關(guān)于如何在Laravel5中正確設(shè)置文件權(quán)限的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Laravel5具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05PHP安裝GeoIP擴(kuò)展根據(jù)IP獲取地理位置及計(jì)算距離的方法
這篇文章主要介紹了PHP安裝GeoIP擴(kuò)展根據(jù)IP獲取地理位置及計(jì)算距離的方法,包括獲取目標(biāo)IP所在的國家地區(qū)等信息,需要的朋友可以參考下2016-07-07在laravel中使用with實(shí)現(xiàn)動(dòng)態(tài)添加where條件
今天小編就為大家分享一篇在laravel中使用with實(shí)現(xiàn)動(dòng)態(tài)添加where條件,具有好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-10-10