zoukankan      html  css  js  c++  java
  • CakePHP常用技巧总结

    简介:这是CakePHP常用技巧总结的详细页面,介绍了和php,有关的知识、技巧、经验,和一些php源码等。

    class='pingjiaF' frameborder='0' src='http://biancheng.dnbcw.info/pingjia.php?id=327021' scrolling='no'> 问:开发中,程序一般设定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()
        {
          // ...
        }
    }

    “CakePHP常用技巧总结”的更多相关文章 》

    爱J2EE关注Java迈克尔杰克逊视频站JSON在线工具

    http://biancheng.dnbcw.info/php/327021.html pageNo:12
  • 相关阅读:
    How to build Linux system from kernel to UI layer
    Writing USB driver for Android
    Xposed Framework for Android 8.x Oreo is released (in beta)
    Linux Smartphone Operating Systems You Can Install Today
    Librem 5 Leads New Wave of Open Source Mobile Linux Contenders
    GUADEC: porting GNOME to Android
    Librem 5 – A Security and Privacy Focused Phone
    GNOME and KDE Join Librem 5 Linux Smartphone Party
    Purism计划推出安全开源的Linux Librem 5智能手机
    国产系统之殇:你知道的这些系统都是国外的
  • 原文地址:https://www.cnblogs.com/ooooo/p/2250883.html
Copyright © 2011-2022 走看看