问题:
在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. 关于Sublime text 的PHP编译环境配置的问题

    前一段时间终于装上了传说中的代码编辑神器====>Sublime Text ,一打开便爱不释手,于是在网上找PHP的配置方案和插件,所有的一切都搞定了,可就是编译的时候没有显示,也没有提示,熬了 ...

  2. sql批量更换dedecms文章来源和作者

    前面写了一篇修改dedecms默认文章来源 "未知"改为关键词,那个是修改以后发布的文章“来源”才会变成自己设定的关键词,如果修改之前已经有很多文章了,那些文章“来源”还是显示“未 ...

  3. js文字滚动

      <style type="text/css">  #gongao{width:1000px;height:30px;overflow:hidden;line-hei ...

  4. Mac Pro 安装 cmake,报错 Warning: cmake-3.5.2 already installed, it's just not linked

    1.先安装 brew,参考文章:Mac Pro 安装 Homebrew 软件包管理工具 2.执行安装命令 brew install cmake 出现警告提示: Warning: cmake-3.5.2 ...

  5. jQuery的$.ajax示例

    $.ajax({ url: 'index.php?module=products&submod=product_experience_manage&method=ajaxGetSele ...

  6. Swift3.0P1 语法指南——字符串与字符

    原档:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programmi ...

  7. Android SDK Manager 无法下载更新,或者更新速度超慢,或者待安装包列表不显示

    解决方法: 转自 http://www.cnblogs.com/tc310/archive/2012/12/21/2828450.html http://jingyan.baidu.com/artic ...

  8. [POJ1177]Picture

    [POJ1177]Picture 试题描述 A number of rectangular posters, photographs and other pictures of the same sh ...

  9. Android活动管理工具

    ActivityCollector.java import android.app.Activity; import java.util.ArrayList; import java.util.Lis ...

  10. Python自动化之sqlalchemy

    如果该数 据库支持 自增列 ,则 SQLAlchemy 默认 自动 设定 表中第一个 类型 为整形 的主键 为自增列 ORM介绍 orm英文全称object relational mapping,就是 ...