CakePHP中文手册【翻译】-Controller
Controller
Controller用来管理应用程序某个部分的逻辑。最常见的是,Controller用来管理单个model的逻辑。例如,如果你正在建立一个理video收集的站点,你可也能会有一个VideoController以及一个RentalController,他们会各自管理你的video以及租赁。在Cake,controller名字一直是复数的。
应用程序的controller类扩展了Cake的AppController类,而AppController又扩展了核心的Controller类。Controller可以包含任何数量的动作:在Web应用程序中应用的函数来显示视图(view)。
AppController类可以在/app/app_controller.php中定义,并且它应该包含在2个或多个controller中共享的方法。它自己也扩展了Controller类,此类是一个标准的Cake库。
一个动作就是一个controller的单独功能。如果一个进来的页面请求指定了在路由配置中配置的它,Dispatcher会自动运行它。再回到我们的video实例,VideoController可以包含view(), rent()和search()等动作。可以在
/app/controllers/videos_controller.php发现此controller,并且包含:
class VideosController extends
AppController { function view($id) {
//action logic goes
here.. } function rent($customer_id, $video_id) {
//action logic goes
here.. } function search($query) {
//action logic goes
here.. } } |
你可以使用下面的URL样例来访问这些动作:
http://www.example.com/videos/view/253
http://www.example.com/videos/rent/5124/0-235253
http://www.example.com/videos/search/hudsucker+proxy
|
但是,这些页面看起来怎么样呢?你需要为这些动作的每一个定义一个视图-请参看下一章,但是还是请跟着我:下面的章节将向你展示如何利用Cake Controller的力量,并使用它的优势。特别的是,你会学到如何让你的controller处理到视图的数据,转向用户,以及更多其他的。
第1节
Controller功能
在本章介绍Cake Model的大部分常用功能的同时,记住使用http://api.cakephp.org获取所有参考也是非常重要的。
与视图交互
set
- string $var
- mixed $value
本函数是将Controller的数据传递给view的主要方法。你可以使用它处理任何事情:单个值,整个数组等。一旦你使用了set(),此变量会传递到view里:在Controller设置set('color',
'blue'),这样$color就会在view中可用。
validateErrors
返回未成功的保存生成的错误总数。
validate
根据在model中定义的验证规则验证model数据。参考第11章获取更多信息。
render
- string $action
- string $layout
- string $file
你可能不会经常使用本函数,因为在每个controller动作的结束之时,会自动调用render(呈现)[1],在render你的动作之后会命名view。可选的是,你也可以在controller逻辑的任何位置,调用此方法render view。
用户转向(User Redirect)
redirect
- string $url
使用本函数会告诉你的用户去哪里。这里传入的URL可以是Cake的一个内部URL,也可以是一个完整有效的URL(http://...).
flash
- string $message
- string $url
- int $pause
本函数在你的flash布局(layout,可在 app/views/layouts/flash.thtml找到)里,显示$message此消息$pause秒钟,然后用户转向到指定的$url.
Cake的redirect()
和flash()函数没有包含exit()的调用。如果你打算让你的应用程序在redirect()
或flash()停止,你自己需要在后面立即调用exit(),这取决于你的情况(例如,如果你需要执行某些回调)。
Controller回调(Callback)
Cake Controller有一些回调函数,你可以使用他们并在重要的controller函数前或后插入你自己的逻辑。为了应用这些功能,在你的Controller里声明这些函数,声明时使用下面详细介绍的参数以及返回值。
- beforeFilter
在每个Controller动作之前调用。它的一个有用之处就是用来检验活动的对话(session)以及角色。
- afterFilter
在每个Controller动作之后调用。
- beforeRender
在view render之前,controller逻辑之后调用。
其他有用的函数
下面这些函数是Cake对象类的一部分时,他们也可以在Controller里可用:
requestAction
- string $url
- array $options
本函数可以调用任何地方的Controller动作,并返回已经render的view。$url是一个Cake URL(/controllername/actionname/params).如果$extra数组包含了‘return’键,会自动为Controller动作将AutoRender设置为true。
你可以使用requestAction从另外的controller动作里获取数据,或者从一个controller得到整个已经render的view。
首先,很容易从一个controller中得到数据。你仅仅使用需要数据的view里的请求动作。
// Here is our simple controller: class UsersController extends
AppController { function getUserList() {
$this->User->findAll(); } } |
假设我们需要创建一个简单的表来显示系统里的用户。为了替换其他controller里的重复代码,我们可以使用UsersController::getUserList(),来代替requestAction()获取数据。
class ProductsController extends
AppController { function showUserProducts() {
$this->set('users', $this->requestAction('/users/getUserList'));
// Now the $users
variable in the view will have the data from
// UsersController::getUserList(). } } |
如果在你的非静态的应用程序中有一个经常使用的元素,你可能会使用requestAction()将它插入到view里。我们说不是从UsersController::getUserList传递数据,实际上,我们想在另外的一个controller里面render动作的view(它可能包含由一个表组成)。你会省略重复的view代码。
class ProgramsController extends
AppController { function viewAll() {
$this->set('userTable', $this->requestAction('/users/getUserList', array('return')));
// Now, we can echo
out $userTable in this action's view to
// see the rendered view that is also available at /users/getUserList. } } |
请注意,requestAction()方法调用的动作是使用了一个空的layout(布局)来进行render的—这种方法让你不必担心,它在布局的内部开始进行render。
requestAction()方法在AJAX情况下也是非常有用的,在这种情况下,在AJAX更新之前或之中,一个view的小元素也需要调用。
log
- string $message
- int $type = LOG_ERROR
你可以使用本函数记录在web应用程序中发生的不同事件。可以在Cake的 /tmp 目录下找到日志。
如果$type是PHP的常量LOG_DEBUG,编写的消息是作为调试信息写入日志的。其他任意的类型都是做为错误写入日志的。
// Inside a controller,
you can use log() to write entries: |
postConditions
- array $data
一个可以将$this->data传入的方法。它会传回一个格式为model条件的数组。
例如,如果我有一个查找某人的表单:
// app/views/people/search.thtml: <?php echo $html->input('Person/last_name'); ?> |
提交此带有此元素的表单,会有如下$this->data的数组:
Array
(
[Person] => Array
(
[last_name] =>
)
)
|
这时候,我们可以使用postConditions()来格式化本数据,并在model中使用:
// app/controllers/people_controller.php: $conditions = $this->postConditions($this->data); // Yields an array looking like this: Array (
[Person.last_name] => ) // Which can be used in model find
operations: $this->Person->findAll($conditions); |
第2节
Controller 变量
操作Controller里的少量变量,可以让你最大程度的使用Cake的额外功能:
$name
PHP4没有把当前的驼峰格式的类名给我们。如果你有问题,可以使用此变量来设置正确的驼峰格式的类名。
$uses
你的Controller是否使用多个model呢?FragglesController会自动加载$this->Fraggle,但是如果你也想访问$this->Smurf,试试将下面的东东加到你的controller中:
var $uses = array('Fraggle','Smurf'); |
请注意你是如何在$use数组中包含Fraggle model的,虽然在之前它也自动可用。
$helpers
使用本变量可以让controller把 helper加载到它的view中去。HTML
helper会自动加载,但是你可以使用本变量指定其他的:
var $helpers = array('Html',' |
记住,如果你打算用它的话,你需要在$helpers数组中包含HtmlHelper。一般它是缺省可用的,但是如果你定义了没有它的$helpers,在你的view中你会得到错误信息。
$layout
将本变量设置为你想在controller中使用的布局名。
$autoRender
将本变量设置为false,会自动停止action的render。
$beforeFilter
如果你想让你的一点点代码在每次的action调用中都运行(和任何动作运行之前),使用$beforeFilter吧.此东西对访问控制来说真的非常好-你可以在任何动作发生前检查用户的权限。将此变量设置为一个包含controller 动作的数组。可以如下运行:
class ProductsController extends
AppController { var $beforeFilter = array('checkAccess'); function checkAccess() {
//Logic to check
user identity and access would go here.... } function index() {
//When this action
is called, checkAccess() is called first. } } |
$components
与$helpers和$uses一样。此变量用来加载你需要的组件:
var $components = array('acl');[2] |
Section 3
Controller参数
在Cake controller中,Controller的参数在$this->params 中。本变量用来把数据放入controller里,并且提供访问当前请求的信息。$this->params最常用的使用方法是访问已经通过POST或GET传递到Controller的信息。
$this->data
用来处理从HTML Helper表单到controller的POST数据。
// A HTML Helper is used to create a form
element $html->input('User/first_name'); // When rendered in the HTML would look
something like: <input
name="data[User][first_name]" value=""
type="text" /> // And when submitted to the controller via
POST, // shows up in
$this->data['User']['first_name'] Array (
[data] => Array
(
[User] => Array ( [username] => mrrogers [password] =>
myn3ighb0r [first_name] => Mister [last_name] => )
) ) |
$this->params['form']
所有表单的POST数据都存储在这里,包含在$_FILES发现的信息。
$this->params['bare']
如果当前的布局没有的话设置为1,否则为0
$this->params['
如果当前的布局是ajax,存储1,否则为0
$this->params['controller']
存储当前处理请求的controller名。例如,如果调用URL /posts/view/1,$this->params['controller']等于"posts".
$this->params['action']
存储当前处理请求的action名,例如,如果调用URL /posts/view/1,$this->params['action']等于"view"。
$this->params['pass']
存储当前请求的GET查询字符串。例如,如果调用URL /posts/view/?var1=3&var2=4,$this->params['pass']等于"?var1=3&var2=4".
$this->params['url']
存储当前请求的URL,并伴有get变量的值对。例如,如果调用URL /posts/view/?var1=3&var2=4,$this->params['url']会为:
[url] => Array
(
[url] => posts/view
[var1] => 3
[var2] => 4 ) |