CakePHP中文手册【翻译】-Controller

Controller

Controller用来管理应用程序某个部分的逻辑。最常见的是,Controller用来管理单个model的逻辑。例如,如果你正在建立一个理video收集的站点,你可也能会有一个VideoController以及一个RentalController,他们会各自管理你的video以及租赁。Cakecontroller名字一直是复数的。

应用程序的controller类扩展了CakeAppController类,而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.

Cakeredirect()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动作,并返回已经renderview$url是一个Cake URL(/controllername/actionname/params).如果$extra数组包含了‘return’键,会自动为Controller动作将AutoRender设置为true

你可以使用requestAction从另外的controller动作里获取数据,或者从一个controller得到整个已经renderview

首先,很容易从一个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 目录下找到日志。

如果$typePHP的常量LOG_DEBUG,编写的消息是作为调试信息写入日志的。其他任意的类型都是做为错误写入日志的。

// Inside a controller, you can use log() to write entries:

$this->log('Mayday! Mayday!');

//Log entry:

06-03-28 08:06:22 Error: Mayday! Mayday!

$this->log("Look like {$_SESSION['user']} just logged in.", LOG_DEBUG);

//Log entry:

06-03-28 08:06:22 Debug: Looks like Bobby just logged in.

 

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] => Anderson
        )
)

这时候,我们可以使用postConditions()来格式化本数据,并在model中使用:

// app/controllers/people_controller.php:

 

$conditions = $this->postConditions($this->data);

 

// Yields an array looking like this:

 

Array

(

    [Person.last_name] => Anderson

)

 

// 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

使用本变量可以让controllerhelper加载到它的view中去。HTML helper会自动加载,但是你可以使用本变量指定其他的:

var $helpers = array('Html','Ajax','Javascript');

记住,如果你打算用它的话,你需要在$helpers数组中包含HtmlHelper。一般它是缺省可用的,但是如果你定义了没有它的$helpers,在你的view中你会得到错误信息。

$layout

将本变量设置为你想在controller中使用的布局名。

$autoRender

将本变量设置为false,会自动停止actionrender

$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最常用的使用方法是访问已经通过POSTGET传递到Controller的信息。

$this->data

用来处理从HTML Helper表单到controllerPOST数据。

// 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] => Rogers

                )

 

        )

)

$this->params['form']

所有表单的POST数据都存储在这里,包含在$_FILES发现的信息。

$this->params['bare']

如果当前的布局没有的话设置为1,否则为0

$this->params['ajax']

如果当前的布局是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

        )



[1] 译者注:render是呈现的意思,比如将web页面呈现出来给用户。不过,在本文中都直接使用render

[2] 它会加载ACL组件,更多信息参看ACL组件这一章。

Last Updated:2006年12月1日

posted @ 2006-11-16 17:45  张太国  阅读(...)  评论(...编辑  收藏