问题:
在yii中,一个controller会包含若干个action。有时为了重用或代码管理等目的,我们希望这些action可以单独定义成一个类,然后在controller中使用。那么在yii中要如何实现呢?
假设我们有这样一个例子

TestController.php,文件位于wwwroot/blog/controllers/,wwwroot对应http://www.example.com/
代码如下:
  1. <?php
  2. class TestController extends Controller {
  3. public function actionHello($name='ball'){
  4. echo "hello $name";
  5. }
  6. }

代码功能很简单,接收一个名字参数,显示hello $name。

访问:
http://www.example.com/blog/index.php?r=test/hello&name=xuan
页面显示:
hello xuan

注:  
actionHello函数的$name参数最好有默认值。不然当url中无$name参数时页面会报错。

实现
下面我们要做的是,将actionHello形成一个单独的类,在TestController中调用它。
1. 建立wwwroot/blog/controllers/test/目录
目录名定为test是yii推荐的写法,建议action所在的目录与对应的controller同名,当然不这样也没有关系。
2.在test目录中创建HelloAction.php文件
文件内容如下:

  1. <?php
  2. class HelloAction extends CAction{
  3. public function run($name='ball'){
  4. echo "Hello $name";
  5. }
  6. }

注意:  

1.此类一定要继承自CAction类
2.必须有run方法供外部调用
3.run方法的参数,即为url中的请求参数。当然也可以通过$_GET的方式在函数内部取得
3.修改TestController.php

  1. <?php
  2. class TestController extends Controller {
  3. public function actions(){
  4. return array('hello'=>array(
  5. 'class'=>'application.controllers.test.HelloAction',
  6. )
  7. );
  8. }
  9. }
好了,看看我们的成果吧,访问:
http://www.example.com/blog/index.php?r=test/hello&name=xuan
页面显示:

hello xuan

注:
对于'class'=>'application.controllers.test.HelloAction'在官方例子中你也许会看到类似'class'=>'HelloAction'的写法。
不要困惑,其实目的是一样。本例中之所以写为“application.controllers.test.HelloAction”,是因为test目录不在yii自动加载范畴。
如果之前有导入:Yii::import('application.controllers.test.*');
那么'class'=>'HelloAction'就可以正常工作了。

More

1. 如果TestController同时定义了上述actions规则,又包含了actionHello方法会怎么样呢?
答案是优先执行actionHello方法,actions相应的规则不生效。
2.controller中如果有特殊的参数要传给actoin,如何处理?
通过actoins方法中的规则传递。

代码类似

  1. return array(
  2. 'action'=>array(
  3. 'class'=>'path.to.ActionClass',
  4. 'property1'=>'value1',
  5. 'property2'=>'value2',
  6. ),
  7. );

但action中必须有相应的property属性,且设为public。
对应本文的例子,假设TestController要传一个somthingToSay给HelloAction,代码如下:
TestController.php

  1. <?php
  2. class TestController extends Controller {
  3. public function actions(){
  4. return array('hello'=>array(
  5. 'class'=>'application.controllers.test.HelloAction',
  6. 'somethingToSay'=>'welcome to yii',
  7. ));
  8. }
  9. }

HelloAction.php

  1. <?php
  2. class HelloAction extends CAction{
  3. public $somethingToSay = '';
  4. public function run($name='ball'){
  5. echo "Hello $name, {$this->somethingToSay}.";
  6. }
  7. }

访问
http://www.example.com/blog/index.php?r=test/hello&name=xuan 页面显示:
Hello xuan, welcome to yii.

路由main.php:                   '<controller:\w+>/<action:\w+>/<subAction:\w+>' => '<controller>/<action>',

如何在yii的controller中调用外部action的更多相关文章

  1. 如何在Python脚本中调用外部命令(就像在linux shell或Windows命令提示符下输入一样)

    如何在Python脚本中调用外部命令(就像在linux shell或Windows命令提示符下输入一样) python标准库中的subprocess可以解决这个问题. from subprocess ...

  2. 关于controller中调用多个service方法的问题

    一般service方法是有事务的,把所有操作封装在一个service方法中是比较安全的. 如果在controller中调用多个service方法,只有查询的情况下是可以这样的.

  3. PHP中调用外部命令的方法

    在PHP中调用外部命令,可以用如下三种方法来实现: 方法一:用PHP提供的专门函数(四个): PHP提供4个专门的执行外部命令的函数:exec(), system(), passthru(), she ...

  4. Asp.net Controller中View 和Action方法认证Authorize 及对AuthorizeAttribute扩展

    Asp.net Controller中View和Action方法认证Authorize 在建立Web 站点安全性时 1.登录后才可访问系统文件 ——限制 Forms认证 <authenticat ...

  5. 在Salesforce中调用外部系统所提供的的Web Service

    这里需要提供外部service所对应的WSDL文件(Salesforce只支持从本地上传),并且提供的WSDL文件有如下两点要求: 1):wsdl 文件只能有一个binding,Salesforce是 ...

  6. phpcms中调用外部网站数据

    1.在phpcms后台模块->模块管理->数据源->外部数据源 中 添加外部数据源 2.在phpcms前台模板中,使用get标签获取数据源中数据. {pc:get sql=" ...

  7. [转]VC中调用外部exe程序方式

    本文转自:http://blog.sina.com.cn/s/blog_486285690100ljwu.html 目前知道三种方式:WinExec,ShellExecute ,CreateProce ...

  8. asp.net mvc 3.0 知识点整理 ----- (2).Controller中几种Action返回类型对比

    通过学习,我们可以发现,在Controller中提供了很多不同的Action返回类型.那么具体他们是有什么作用呢?它们的用法和区别是什么呢?通过资料书上的介绍和网上资料的查询,这里就来给大家列举和大致 ...

  9. ant中调用外部ant任务的两种方法

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

随机推荐

  1. HDU 2014

    #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> typedef float ElementType; void Select_Sort ...

  2. 大数据之Ganglia

    1.什么是ganglia 一个开源集群监视项目:Ganglia可以做系统监控,但是,目前它不支持服务器异常或故障报警功能. 2.Ganglia监控集群架构 Ganglia 集群主要是由gmond.gm ...

  3. Linux/CentOS 同步网络时间

    由于硬件的原因,机器或多或少的跟标准时间对不上,一个月的误差几秒到几分钟不等.对于服务器来说时间不准,会有很多麻烦.例如,支付的时候,无法下单,游戏无法登录等. 方法一:用 ntpdate从时间服务器 ...

  4. unity3d 安卓IOS推送

    https://github.com/jpush/jpush-unity3d-plugin

  5. [BZOJ3991][SDOI2015]寻宝游戏

    [BZOJ3991][SDOI2015]寻宝游戏 试题描述 小B最近正在玩一个寻宝游戏,这个游戏的地图中有N个村庄和N-1条道路,并且任何两个村庄之间有且仅有一条路径可达.游戏开始时,玩家可以任意选择 ...

  6. 跟着百度学PHP[4]OOP面对对象编程-7-OOP的一些关键子讲解

    面对对象常用的一些关键子:http://www.cnblogs.com/xishaonian/p/6146794.html排版不是很好望见谅. THE END

  7. OpenGL中平移、旋转、缩放矩阵堆栈操作

    在OpenGL中,图元的几何变换均为线性变换,通过矩阵变换实现.OpenGL中的坐标用齐次坐标表示,即(x,y,z)表示成(x',y',z',h),其中x=x'/h; y=y'/h; z=z'/h. ...

  8. 2.7---判断链表是否是回文(CC150)

    注意,如果用的方法是翻转整个链表,那么链表都被改变了.就无法做了. 此外注意fast.next.next!= null;不然也会报错.要保证后面的比前面的少. 答案: public static bo ...

  9. 'ModelOptions' object has no attribute 'get_field_names

    peewee安装时随意了点.装了2.8.0的. 倒回到2.6.0就好了. sudo pip uninstall peewee sudo pip install peewee==2.6.0

  10. uniq命令注意事项,检查重复行的时候,只会检查相邻的行。

    今天在使用uniq命令统计数量时,uniq -c总是得不到想要的效果,相同的行没有合并,例如 后来在http://ju.outofmemory.cn/entry/78365才看到,原来uniq检查重复 ...