问:开发中,程序通常设定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()
{
// ...
}
}