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() 
    { 
      // ... 
    } 
}

你可能感兴趣的:(url,cakephp,常用技巧,CakePHP技巧)