yii2的操作action()

PHP 林涛 4854℃ 0评论

1、什么是内联操作,什么是独立操作。
操作通常是用来执行资源的特定操作,因此,操作ID通常为动词,如view, update等。
内联操作:
操作方法的名字是根据操作ID遵循如下规则衍生:
将每个单词的第一个字母转为大写;
去掉中横杠;
增加action前缀.
例如index 转成 actionIndex, hello-world 转成 actionHelloWorld。

注意: 操作方法的名字大小写敏感,如果方法名称为ActionIndex不会认为是操作方法, 所以请求index操作会返回一个异常,也要注意操作方法必须是公有的,私有或者受保护的方法不能定义成内联操作。
因为容易创建,内联操作是最常用的操作,但是如果你计划在不同地方重用相同的操作, 或者你想重新分配一个操作,需要考虑定义它为独立操作。
所以一句话总结,内联操作就是定义在Controller中的,以action前缀,并且完成需要功能的操作。

独立操作:
顾名思义,就是一个完成独立功能的操作,处理过程独立定义,在需要的Controller只是调用,完成一些事物功能,特别是一些公共的重用的功能。

独立操作通过继承yii\base\Action或它的子类来定义。 例如Yii发布的yii\web\ViewAction和yii\web\ErrorAction都是独立操作。
要使用独立操作,需要通过控制器中覆盖yii\base\Controller::actions()方法在action map中申明,如下例所示:

public function actions()
{
return [
// 用类来申明”error” 操作
‘error’ => ‘yii\web\ErrorAction’,

// 用配置数组申明 “view” 操作
‘view’ => [
‘class’ => ‘yii\web\ViewAction’,
‘viewPrefix’ => ”,
],
];
}

如上所示, actions() 方法返回键为操作ID、值为对应操作类名或数组configurations 的数组。 和内联操作不同,独立操作ID可包含任意字符,只要在actions() 方法中申明.

为创建一个独立操作类,需要继承yii\base\Action 或它的子类,并实现公有的名称为run()的方法, run() 方法的角色和操作方法类似,例如:

<?php
namespace app\components;

use yii\base\Action;

class HelloWorldAction extends Action
{
public function run()
{
return “Hello World”;
}
}

操作参数

内联操作的操作方法和独立操作的 run() 方法可以带参数,称为操作参数。 参数值从请求中获取,对于yii\web\Application网页应用, 每个操作参数的值从$_GET中获得,参数名作为键; 对于yii\console\Application控制台应用, 操作参数对应命令行参数。

如下例,操作view (内联操作) 申明了两个参数 $id 和 $version。

namespace app\controllers;

use yii\web\Controller;

class PostController extends Controller
{
public function actionView($id, $version = null)
{
// …
}
}

操作参数会被不同的参数填入,如下所示:
http://hostname/index.php?r=post/view&id=123: $id 会填入’123’,$version 仍为 null 空因为没有version请求参数;
http://hostname/index.php?r=post/view&id=123&version=2: $id 和 $version 分别填入 ‘123’ 和 ‘2’`;
http://hostname/index.php?r=post/view: 会抛出yii\web\BadRequestHttpException 异常 因为请求没有提供参数给必须赋值参数$id;
http://hostname/index.php?r=post/view&id[]=123: 会抛出yii\web\BadRequestHttpException 异常 因为$id 参数收到数字值 [‘123’]而不是字符串.
如果想让操作参数接收数组值,需要指定$id为array,如下所示:

public function actionView(array $id, $version = null)
{
// …
}
现在如果请求为 http://hostname/index.php?r=post/view&id[]=123, 参数 $id 会使用数组值[‘123’], 如果请求为 http://hostname/index.php?r=post/view&id=123, 参数 $id 会获取相同数组值,因为无类型的’123’会自动转成数组。

控制器生命周期:

处理一个请求时,应用主体 会根据请求路由创建一个控制器,控制器经过以下生命周期来完成请求:

在控制器创建和配置后,yii\base\Controller::init() 方法会被调用。
控制器根据请求操作ID创建一个操作对象:
如果操作ID没有指定,会使用yii\base\Controller::defaultAction默认操作ID;
如果在yii\base\Controller::actions()找到操作ID,会创建一个独立操作;
如果操作ID对应操作方法,会创建一个内联操作;
否则会抛出yii\base\InvalidRouteException异常。
控制器按顺序调用应用主体、模块(如果控制器属于模块)、控制器的 beforeAction() 方法;
如果任意一个调用返回false,后面未调用的beforeAction()会跳过并且操作执行会被取消; action execution will be cancelled.
默认情况下每个 beforeAction() 方法会触发一个 beforeAction 事件,在事件中你可以追加事件处理操作;
控制器执行操作:
请求数据解析和填入到操作参数;
控制器按顺序调用控制器、模块(如果控制器属于模块)、应用主体的 afterAction() 方法;
默认情况下每个 afterAction() 方法会触发一个 afterAction 事件,在事件中你可以追加事件处理操作;
应用主体获取操作结果并赋值给响应

所以总结一下:当访问一个操作请求时,整个过程是这样子:
(1)执行控制器,按顺序调用应用主体、模块(如果控制器属于模块)、控制器的 beforeAction(),即从访问顺序执行beforeAction(),完成一些必要事物。
(2)再判断有没有指定访问操作ID,如果没有,则访问yii\base\Controller::defaultAction默认操作ID。
(3)如果访问指定了访问的操作ID,那首先去执行独立操作actions里定义的对应的操作ID,如果独立的操作ID不存在,则再去访问内联操作ID,完成对应操作。
(4)最后按顺序调用控制器、模块(如果控制器属于模块)、应用主体的 afterAction() 方法;默认情况下每个 afterAction() 方法会触发一个 afterAction 事件,在事件中你可以追加事件处理操作。
(5)返回操作结果给应用主体。

如需转载请注明: 转载自26点的博客

本文链接地址: yii2的操作action()

转载请注明:26点的博客 » yii2的操作action()

喜欢 (0)
发表我的评论
取消评论

表情
(49)个小伙伴在吐槽
  1. 复刻手表ﯥ一手货源ﯥ原单包包 +VX:LoveMeJck万国ᬣGUCCIᬣRolexᬣ卡地亚ᬣCoachᬣ路易威登ᬣRolexᬣTiffanyᬣ
    abircnkw2017-01-15 11:01 回复
  2. 原单A货ꁼ奢侈品ꁼ原单包包 http://1282.118v.netCoach劳力士LV菲拉格慕Bally
    bngvnolyi2017-01-15 10:17 回复
  3. 精仿奢侈品ⲷ一件代发ⲷ精仿奢侈品 微Xin:LoveMeJckchanel⪶万国⪶LouisVuitton⪶范思哲Versace⪶古驰⪶博柏利⪶劳力士⪶蔻驰⪶Prada⪶
    一件代发2017-01-15 07:50 回复
  4. 奢侈品ћ高仿原单ћ高仿原单 http://t.cn/RMWZE1RBallyਗHermesਗHermesਗ路易威登ਗ普拉达ਗ古驰ਗCoachਗ
    一件代发2017-01-15 07:50 回复
  5. 复刻手表㇮1:1包包㇮高仿原单 http://7891.118v.netGUCCIѴ伯爵ѴCartierѴ古驰ѴCartierѴ宝格丽Ѵ
    wx31.com2017-01-15 07:50 回复
  6. 高仿包包⭋顶级A货⭋高仿包包 Wei信:LoveMeJck爱马仕む伯爵むRolexむ范思哲VersaceむCartierむTiffanyむCoachむ蔻驰む
    翁环希2017-01-15 07:49 回复
  7. 精品原单鿈原单奢侈品鿈一手货源 http://t.cn/RMWZO6N爱马仕ㇼBvlgariㇼ范思哲VersaceㇼCartierㇼ阿玛尼ㇼ
    seqsy2017-01-15 07:47 回复
  8. 奢侈品㊓源头货㊓精仿奢侈品 wx31.comLVॿBurberryॿ菲拉格慕ॿchanelॿCartierॿ
    csrgpsre2017-01-15 07:47 回复
  9. 一手货源⿅奢侈品⿅1:1手表 加微Xin:LoveMeJck阿玛尼⓶菲拉格慕⓶Rolex⓶蒂芙尼⓶路易威登⓶
    ofbngosh2017-01-15 07:47 回复
  10. 原单A货タ高仿手表タ原单包包 wx31.comGUCCIࣕ万国ࣕ蒂芙尼ࣕPradaࣕMontblancࣕ江诗丹顿ࣕBvlgariࣕDiorࣕ
    lllkp2017-01-15 07:46 回复
  11. 顶级A货ﬢ外贸高仿ﬢ外贸高仿 http://4791.118v.netLV੊阿玛尼੊蒂芙尼੊香奈儿੊路易威登੊Bally੊劳力士੊
    zefnkcny2017-01-15 07:46 回复
  12. 外贸原单ﭵ高仿原单ﭵ高仿手表 加微:LoveMeJckGUCCIﯹLVﯹ积家ﯹ博柏利ﯹ积家ﯹ江诗丹顿ﯹ路易威登ﯹ万国ﯹ范思哲Versaceﯹ
    118v.net2017-01-15 05:25 回复
  13. 复刻手表ಞ顶级A货ಞ顶级A货 http://456.118v.net香奈儿⡏IWC⡏劳力士⡏Burberry⡏LV⡏江诗丹顿⡏Bally⡏
    一件代发2017-01-15 05:25 回复
  14. 高仿原单᫅高仿奢侈品᫅原单奢侈品 http://t.cn/RMWvb9h古驰➅万宝龙➅菲拉格慕➅Tiffany➅普拉达➅宝格丽➅Tiffany➅爱马仕➅
    wileyrxc2017-01-15 05:24 回复
  15. 1:1包包ᛁ原单奢侈品ᛁ1:1手表 Wei信:LoveMeJck宝格丽Ὡ宝格丽ὩHermesὩ万国Ὡ卡地亚Ὡ
    exvdi2017-01-15 05:24 回复
  16. 一手货源⌮原单A货⌮奢侈品 威信:LoveMeJckIWC᮵LV᮵chanel᮵Bvlgari᮵古驰᮵Hermes᮵博柏利᮵
    pedkheucn2017-01-15 05:24 回复
  17. 一手货源ᘌ一件代发ᘌA货货源 V:LoveMeJckGUCCIђ蒂芙尼ђRolexђPradaђIWCђ
    vfgaryy2017-01-15 05:24 回复
  18. 一手货源ⷯ顶级A货ⷯ复刻手表 http://1972.118v.netRolexꆑBallyꆑ迪奥ꆑ博柏利ꆑRolexꆑ范思哲VersaceꆑCoachꆑ积家ꆑ积家ꆑ
    zgxgqat2017-01-15 05:24 回复
  19. 顶级A货﹟原单包包﹟外贸原单 118v.net菲拉格慕⛟万国⛟古驰⛟Bvlgari⛟江诗丹顿⛟
    xaulmaojy2017-01-15 05:24 回复
  20. 高仿原单Ꞝ原单包包Ꞝ精仿奢侈品 118v.net蒂芙尼Ѷ阿玛尼Ѷ古驰ѶMontblancѶ宝格丽Ѷ香奈儿Ѷ巴利Ѷ蒂芙尼Ѷ百达翡丽Ѷ
    ygxvpoat2017-01-15 05:24 回复
  21. 1:1包包᷒高仿包包᷒外贸高仿 VX:LoveMeJck伯爵๧Montblanc๧路易威登๧劳力士๧博柏利๧伯爵๧劳力士๧巴利๧
    rhryr2017-01-15 05:24 回复
  22. 外贸高仿ڇ源头货ڇ外贸原单 http://t.cn/RMOsWzt万国ˤ伯爵ˤHermesˤ蔻驰ˤ古驰ˤ蒂芙尼ˤchanelˤ
    jtylvqyo2017-01-15 04:56 回复
  23. 精仿奢侈品ð原单包包ð外贸高仿 http://6787.118v.netCartierﹾDiorﹾ百达翡丽ﹾPradaﹾIWCﹾ爱马仕ﹾ古驰ﹾ香奈儿ﹾ
    byuyq2017-01-14 23:10 回复
  24. 一件代发⿺高仿奢侈品⿺奢侈品 http://385.118v.netGUCCI⍢路易威登⍢路易威登⍢普拉达⍢Tiffany⍢
    wx31.com2017-01-14 13:50 回复
  25. 高仿奢侈品⊐一手货源⊐一件代发 wx31.com伯爵ォCartierォIWCォMontblancォ阿玛尼ォ伯爵ォBallyォPradaォchanelォ
    高仿奢侈品2017-01-14 12:42 回复
  26. A货货源﮼源头货﮼外贸高仿 http://t.cn/RMpC3KkBurberryʒ普拉达ʒDiorʒ迪奥ʒCoachʒ
    高仿奢侈品2017-01-14 12:41 回复
  27. 原单包包ᣵ1:1包包ᣵ顶级A货 V:LoveMeJck爱马仕ﻵBvlgariﻵ爱马仕ﻵ香奈儿ﻵ积家ﻵ
    118v.net2017-01-14 12:41 回复
  28. A货货源Ĩ奢侈品ĨA货货源 Wei信:LoveMeJckHermes✯万国✯Prada✯Dior✯积家✯LouisVuitton✯
    外贸高仿2017-01-14 12:40 回复
  29. 一件代发r原单奢侈品r原单包包 +VX:LoveMeJckCoachⅮLouisVuittonⅮ卡地亚ⅮBvlgariⅮMontblancⅮ范思哲VersaceⅮMontblancⅮBallyⅮ爱马仕Ⅾ
    司徒娴英2017-01-14 12:40 回复
  30. 高仿奢侈品ᧂA货货源ᧂ高仿原单 http://1202.118v.net宝格丽⧪LV⧪古驰⧪阿玛尼⧪香奈儿⧪普拉达⧪
    一件代发2017-01-14 12:40 回复
  31. 源头货ᕇ原单包包ᕇ复刻手表 加微Xin:LoveMeJckLouisVuitton꛲chanel꛲范思哲Versace꛲路易威登꛲Dior꛲Coach꛲香奈儿꛲
    辛影2017-01-14 12:40 回复
  32. 高仿奢侈品ⓜ高仿手表ⓜ顶级A货 http://t.cn/RMpCCq3博柏利ᐓ范思哲Versaceᐓ普拉达ᐓCartierᐓ卡地亚ᐓ劳力士ᐓ范思哲VersaceᐓGUCCIᐓ
    凌伊2017-01-14 12:39 回复
  33. 原单奢侈品ﮑ奢侈品ﮑ一手货源 http://t.cn/RMpCXID江诗丹顿⦝卡地亚⦝阿玛尼⦝古驰⦝百达翡丽⦝万国⦝阿玛尼⦝LouisVuitton⦝
    外贸高仿2017-01-14 12:38 回复
  34. 高仿手表ㅬ高仿原单ㅬ源头货 wx31.com菲拉格慕о伯爵о菲拉格慕оTiffanyо范思哲Versaceо爱马仕о
    一件代发2017-01-14 12:38 回复
  35. 原单奢侈品﯒1:1包包﯒精仿奢侈品 Wei信:LoveMeJckBallyͽ蒂芙尼ͽ博柏利ͽDiorͽchanelͽGUCCIͽ
    徐霞苑2017-01-14 12:37 回复
  36. 高仿原单ﯢ高仿原单ﯢ精品原单 wx31.comLV㇎范思哲Versace㇎范思哲Versace㇎伯爵㇎卡地亚㇎百达翡丽㇎Rolex㇎Montblanc㇎博柏利㇎
    高仿奢侈品2017-01-14 12:36 回复
  37. 外贸高仿ᶂ原单A货ᶂ源头货 http://t.cn/RMpC7LHTiffany∥万宝龙∥LV∥GUCCI∥迪奥∥
    葛珍2017-01-14 12:35 回复
  38. 顶级A货㊳复刻手表㊳源头货 Wei信:LoveMeJck伯爵אַGUCCIאַ蒂芙尼אַ卡地亚אַ宝格丽אַLouisVuittonאַBurberryאַ卡地亚אַ
    外贸高仿2017-01-14 09:12 回复
  39. 高仿手表ᷝ精品原单ᷝ精品原单 加微Xin:LoveMeJck蒂芙尼❄Bvlgari❄Rolex❄普拉达❄宝格丽❄
    118v.net2017-01-14 08:53 回复
  40. 一手货源ﮀ外贸原单ﮀ原单奢侈品 wx31.comMontblancﭜ宝格丽ﭜ积家ﭜDiorﭜ蒂芙尼ﭜ
    外贸高仿2017-01-14 07:20 回复
  41. 1:1手表ၔ精仿奢侈品ၔ精仿奢侈品 http://5131.118v.net江诗丹顿ᄌ爱马仕ᄌ万国ᄌ爱马仕ᄌHermesᄌ
    奢侈品2017-01-14 05:21 回复
  42. 顶级A货ᯗ高仿手表ᯗ高仿奢侈品 http://t.cn/RMNnaLM积家˿Bally˿Dior˿迪奥˿爱马仕˿Bvlgari˿迪奥˿Hermes˿chanel˿
    精品原单2017-01-14 01:10 回复
  43. 精品原单◁外贸高仿◁高仿原单 http://t.cn/RMNTYV7爱马仕⏤路易威登⏤chanel⏤古驰⏤古驰⏤
    一手货源2017-01-14 00:18 回复
  44. 高仿奢侈品5奢侈品5顶级A货 http://t.cn/RMNlaGA香奈儿ᅬ积家ᅬ宝格丽ᅬ巴利ᅬ菲拉格慕ᅬIWCᅬchanelᅬPradaᅬGUCCIᅬ
    118v.net2017-01-13 23:56 回复
  45. 顶级A货﯀高仿原单﯀奢侈品 +VX:LoveMeJckHermes⡮路易威登⡮Hermes⡮Bvlgari⡮Cartier⡮万宝龙⡮
    顶级A货2017-01-13 14:33 回复
  46. 很高兴来在这里见到你的文章!言成网商http://www.bengbong.com达芙妮官方旗舰店http://www.enbjp.com
    言成网商2017-01-11 09:37 回复
  47. 学习了,感谢分享
  48. 很不错!
    内部优惠券2017-01-05 15:45 回复
  49. 挺好的,感谢博主的分享。
    凯哥自媒体2017-01-04 15:38 回复