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() 
    { 
      // ... 
    } 
}
相关文章
相关标签/搜索