CakePHP經常使用技巧總結[轉]

問:開發中,程序通常設定debug爲2,如何在某一個特定的action中關閉debug? 
答:Configure::write('debug', 0); 
問:如何靜態化某個action渲染的視圖? 
答:過程就是先得到渲染的內容,再生成靜態文件,這裏看看如何得到渲染後的內容,大體兩個方法: 
1. 能夠使用ob函數。 
2. 在控制器裏$this->requestAction('/controller/action/param', array('return')); 
問:如何改變模型間的關係,生成高效的SQL語句? 
答:在使用CakePHP開 發的過程當中,必須儘量保證DEBUG設置在2,時刻注意CakePHP幫你生成的SQL語句是否正常。這裏就會經常使用到recursive和 unbindModel。這裏須要注意的是,若是使用的是$this->model->read()的話,則能夠 用$this->model->recursive = N;來調整級聯數,若是使用的是$this->model->find() / $this->model->findAll()的話,他們的最後一個形參就是控制級聯數的。 
find( $conditions, 
                $fields, 
                $order, 
                $recursive); 
string                $conditions; 
array                $fields; 
string                $order; 
int                $recursive; 
findAll( $conditions, 
                $fields, 
                $order, 
                $limit, 
                $page, 
                $recursive); 
string                $conditions; 
array                $fields; 
string                $order; 
int                $limit; 
int                $page; 
int                $recursive; 
問:CakePHP程序和其餘PHP程序的session不能統一? 
答:這是由於缺省狀態下,CakePHP修改了Cookie的名字,因此不能和其餘PHP相對應,只要修改core.php文件對應選項即 可:define('CAKE_SESSION_COOKIE', ini_get('session.name'));缺省爲PHPSESSID。 
問:CakePHP程序中,URL大體有幾種形式? 
答:大體有三種形式。 
第一種,藉助mod_rewrite的能力,其URL大體如http://xxx/controller/action/param,只要開啓Apache的重寫模塊便可。 
第二種,是PATH_INFO形式,其URL大體如http://xxx/index.php/controller/action/param,若是想 使用這樣的形式,只要修改core.php中對應行便可:define ('BASE_URL', env('SCRIPT_NAME')); 
第三種形式,是傳統的URL形式,其URL大體如http://xxx/index.php?url=/controller/action/param,至於爲啥能夠這樣,你只要看看CakePHP的.htaccess文件寫法就知道了。 
問:若是CakePHP程序中,僅僅是顯示一些靜態頁面,怎樣處理? 
答:使用缺省的/pages控制器,缺省就帶有幾個例子。 
問:經常使用動做如何統一命名? 
答:經常使用動做統一命名,有助於標準化處理,所謂經常使用動做指的是CRUD常見操做,如: 
class ExampleModel extends AppController 

         var $name = 'Example'; 
         function index() 
         { 
         } 
         function add() 
         { 
         } 
         function edit($id) 
         { 
         } 
         function view($id) 
         { 
         } 
         function remove($id) 
         { 
         } 

問:CakePHP1.2中如何設置input標籤,並驗證? 
答:在CakePHP1.2中,已經不在推薦使用html助手,而使用新的form助 手,設置input標籤大概如「<td><?php echo $form->text('Model.field', array('size' => 50)); ?></td>」,驗證錯誤信息大概如「<td><?php echo $form->error('Model.field', 'error msg')?></td>」 
問:編輯數據的時候,如何方便的顯示待編輯信息? 
答:CakePHP中,只要你使用form助手生成表單,則會自動從控制器的$this->data中提取本身的值。 
function edit($id = null) 

if(! empty($this->data)) 

         if($this->Model->create($this->data) && $this->Model->save()) 
         { 
         $this->flash('msg', '/controller/action/param'); 
         exit(); 
         } 

$this->Post->id = intval($id); 
$this->data = $this->Post->read(); 

問:如何複用一個action? 
答:之前bakery裏一篇文章介 紹根據$this->params['requested']來判斷是否return,而後使用requestAction來完成複用,實際這個判 斷方式有bug,當使用$this->requestAction('/controller/action', array('return'))這樣帶有return參數的調用時,會出錯。更好的判斷方式以下: 
function view($id = null) 

$this->Model->id = intval($id); 
$this->Model->read(); 
if(! empty($this->params['return'])) 

         return $this->Model->data; 

$this->set('model', $this->Model->data); 

問:大部分動做使用Auth組件來控制權限,但少部分不用,如何實現? 
答:由於大部分動做都要使用Auth組件來控制權限,因此最好放在AppController裏,大概代碼以下: 
class AppController extends Controller 

          var $components = array('Auth'); 
這樣在組件初始化的時候,會自動判斷權限。 
而對於少部分例外,只要在相應的子控制器裏設置allow就能夠了,具體以下(好比咱們想Threads控制器的index,view動做能夠自由訪問,不用Auth控制權限): 
class ThreadsController extends AppController 

          var $name = 'Threads'; 
          function beforeFilter() 
          { 
            $this->Auth->allow('index', 'view'); 
          } 
問:如何實現主題功能,同時提供多種風格界面? 
答:CakePHP1.2 已經具有了theme功能,咱們只要在app_controller.php中定義var $view = 'Theme',就會載入theme.php文件,而後會根據咱們的設置(var $theme ='themeName';)定位具體的主題目錄,若是你沒有定義,缺省的主題目錄名字爲themed,而後咱們創建新的目錄(如css,js),就ok了。 
問:如何設置並訪問命名的GET變量? 
答:通常在CakePHP中,GET變量是不命名的,大致形式如/users/view/123這個樣子,而後參數會被自動帶入方法的形參之中,可是有些 時候,咱們仍是須要使用命名的GET變量的,這個時候大致形式如/users/view/name:value,而後咱們能夠在控制器裏通 過$this->namedArgs數組來訪問命名的GET變量,如$this->namedArgs['name']。 
問:如何設置view裏能夠訪問的數據? 
答:簡單的說,咱們只要在控制器裏進行$this->set('name', 'value');之類的操做就能夠了,可是實際上,若是你只是想set控制器$this->data中的變量的 話,這樣的set代碼徹底能夠省略,由於控制器的$this->data變量會被複制到視圖的$this->data的變量中,因此你徹底不 必set這樣的變量,只要在視圖文件中直接echo $this->data['Model'][...]就能夠了。固然,有時候咱們不得不set一些變量,這個時候,咱們仍是有一種技巧可讓代碼更 簡單的: 
$var1 = 'text'; 
$var2 = 'text'; 
$var3 = 'text'; 

$this->set(compact('var1','var2','var3')); 
哈哈,利用compact函數,咱們能夠用一條set語句完成看似要多條才能完成的操做。 
問:如何在控制器裏實現責任鏈? 
答:控制器裏有一個beforeFilter屬性,若是咱們想讓一個動做執行前先進行若干操做(好比:aaa, bbb, ccc),那麼咱們只須要在控制器類中聲明var $beforeFilter便可: 
複製內容到剪貼板 
代碼: 

class AppController extends Controller 

    var $beforeFilter = array('aaa', 'bbb', 'ccc'); 
    function aaa() 
    { 
      // ... 
    } 
    function bbb() 
    { 
      // ... 
    } 
    function ccc() 
    { 
      // ... 
    } 
}
相關文章
相關標籤/搜索