问题:
在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. golang的json操作

    package main import ( "encoding/json" "fmt" "os" ) type ConfigStruct s ...

  2. lianjie

    数值策划入门:如何确定游戏中的资源价值和定价http://bbs.gameres.com/thread_494366.html 一张常规的RPG游戏地图的制作流程 http://bbs.gameres ...

  3. I/O复用机制概述

    导读 /O多路复用技术通过把多个I/O的阻塞复用到同一个select的阻塞上,从而使得系统在单线程的情况下可以同时处理多个客户端请求.与传统的多线程/多进程模型比,I/O多路复用的最大优势是系统开销小 ...

  4. PC-BSD 换名 TrueOS

    导读 PC-BSD 重大更新:面向私人电脑的PC-BSD操作系统开发者.Lumina桌面环境创造者Ken Moore今天宣布系统迎来重大改变. 首先,PC-BSD更名为TrueOS,用户依然能够在PC ...

  5. WEB前端知识在乱花渐欲迷人眼的当下,如何分清主次和学习优先级呢?

    从正美的吐槽开始,我回了下,说对盲目跟风的大众失去信心了.然后一些同学说我固步自封,另一些同学估计想说倚老卖老啥的.我想说清楚一点,我从 未停止过学习,只是对知识的重要程度和精力分配有自己的观点.具体 ...

  6. 剑指Offer 找出字符串中第一个只出现一次的字符

    题目描述 找出字符串中第一个只出现一次的字符 如果无此字符 请输出'.' 输入描述: 输入一串字符,由小写字母组成 输出描述: 输出一个字符 输入例子: asdfasdfo 输出例子: o 思路:数组 ...

  7. hiho #1326 : 有序01字符串

    #1326 : 有序01字符串 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 对于一个01字符串,你每次可以将一个0修改成1,或者将一个1修改成0.那么,你最少需要修改 ...

  8. Hashtable和HashMap的区别举例

    我们先看2个类的定义 public class Hashtable extends Dictionary implements Map, Cloneable, java.io.Serializable ...

  9. [翻译]opengl扩展教程1

    [翻译]opengl扩展教程1 原文地址https://www.opengl.org/sdk/docs/tutorials/ClockworkCoders/extensions.php [翻译]ope ...

  10. git分支管理策略

    http://www.ruanyifeng.com/blog/2012/07/git.html https://www.digitalocean.com/community/tutorials/how ...