如何在yii的controller中调用外部action

问题:

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

假设我们有这样一个例子

TestController.php,文件位于wwwroot/blog/controllers/,wwwroot对应http://www.example.com/

代码如下:

[php] view plaincopy

  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文件

文件内容如下:

[php] view plaincopy

  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的方式在函数内部取得

详见http://www.yiiframework.com/doc/guide/1.1/en/basics.controller#action一节中的Action
Parameter Binding

3.修改TestController.php

[php] view plaincopy

  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,布布扣,bubuko.com

时间: 2024-10-04 14:04:49

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

yii调用外部action与在外部action中渲染页面

// 1. 在controller中映射actionpublic function actions(){ return array( 'create' => 'application.controllers.miiuser.CreateAction', );} // 2. 在action中run方法中写逻辑,但下面的render方法显示不行,因为CAction类没有render方法class CreateAction extends CAction { public function run()

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

这里需要提供外部service所对应的WSDL文件(Salesforce只支持从本地上传),并且提供的WSDL文件有如下两点要求: 1):wsdl 文件只能有一个binding,Salesforce是不支持多个binding的 2):wsdl 文件要包含所有的schema信息,Salesforce是不支持external schema的import的 接下来便是具体的操作步骤: 1):按照此目录 Setup --> Build --> Develop --> Apex Classes 找

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

通过学习,我们可以发现,在Controller中提供了很多不同的Action返回类型.那么具体他们是有什么作用呢?它们的用法和区别是什么呢?通过资料书上的介绍和网上资料的查询,这里就来给大家列举和大致的概括下. (1). ActionResult(base):最基本的Action类型,返回其他类型都可以写ActionResult. (2). ContentResult:返回ContentResult用户定义的内容类型. public ActionResult Content() { return

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

本文转自:http://blog.sina.com.cn/s/blog_486285690100ljwu.html 目前知道三种方式:WinExec,ShellExecute ,CreateProcess,别人已经总结的很好了<vc中调用其他应用程序的方法(函数) winexec,shellexecute ,createprocess>,我全文转载一下,另外后面加点自己的总结(黑体部分,除了标题). 三个SDK函数: WinExec,ShellExecute ,CreateProcess可以实

在Sql Server中调用外部EXE执行程序

exe sql server xp database dos 服务器 一.先开启xp_cmdshell 打开外围应用配置器—> 功能的外围应用配置器—> 实例名\Database Engine\xp_cmdshell—> 启用 二.解决方法 [sql] view plain copy use master Exec xp_cmdshell 'mkdir d:\csj' --调用dos命令创建文件夹,(执行成功了!) [sql] view plain copy Exec xp_cmdshe

【python】如何在某.py文件中调用其他.py内的函数

假设名为A.py的文件需要调用B.py文件内的C(x,y)函数 假如在同一目录下,则只需 import B if __name__ == "__main__": B.C(x,y) 若只需调用单个函数,也可以 from B import C if __name__ == "__main__": C(x,y) 若A.py和B.py位于不同的目录下,可以用以下方法 (假设B.py位于D盘的根目录下) 1.引用所在路径 import sys sys.path.append(

【EBS FORM】进阶3. 在FORM中调用外部功能

来源:http://www.cnblogs.com/chenyongjun/p/3940631.html 1. fun_function.execute fnd_function.execute用于访问指定的基于表单(Form)且可访问的功能(不可访问将抛出错误消息),Oracle建议以此过程替换原内置函数OPEN_FORM.因为fnd_function.execute可以绕开应用安全验证并找到功能正确的访问路径. 可访问说明: 访问的功能需挂在同一职责的相同菜单下,如果被调用的功能不想在菜单下

如何在Visual Studio Code中调用浏览器运行HTML代码

微软刚发布的Visual Studio Code还不支持安装扩展,没有内置的HTML预览功能.如果想要编辑HTML之后直接运行,可以 ctrl+shift+p 搜索 Configure Task Runner. 回车之后打开 tasks.json,修改一下: {     "version": "0.1.0",     "command": "explorer",     "windows": {      

在 Flash ActionScript 2.0 中调用 Javascript 方法

本篇文章由:http://xinpure.com/call-the-javascript-method-in-flash-actionscript-2-0/ 在 Flash ActionScript 2.0 中调用 Javascript 方法 最近在工作中,有个这样的需求: 要从 Flash ActionScript 2.0 中调用网页上的 Javascript 方法 这是一个关于 Flash 和 Javascript 交互的问题. 在 ActionScript 2.0 中调用外部 javasc