yii2基础(三)

Yii2的工作原理:
如图: 
这里写图片描述

1.进行用户注册 或 登录的实现过程,要注意 定义“场景” 及 场景的使用。 
(登录场景 只要 用户名和密码,注册场景 可能要 用户名、密码、邮箱、手机等等) 
Yii2中登录相关的类的继承关系是: 
这里写图片描述

2.调试 
可以采用代码:var_dump($this->errors);来查看错误信息

3.module模块类 或 继承自该类 的模块,设置布局文件的方法 
//false:不使用布局文件 
//null:采用默认的父类布局文件(app/views/layout/main.php) 
//file name: 使用当前module 中 定义的布局文件 
举例:$this->layout = 'main' 
(后续笔记有更详细的说明)

4.语言设置 
①在入口文件 index.php 中设置:

<code class="hljs ruby has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">  `<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$app</span> -> language = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'zh-CN'</span>; <span class="hljs-regexp" style="color: rgb(0, 136, 0); box-sizing: border-box;">//</span>其中<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$app</span> = new yii\web\<span class="hljs-constant" style="box-sizing: border-box;">Application</span>(<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$config</span>);`</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>

②在config/web.php 配置文件中配置:

<code class="hljs php has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">   <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'language'</span> => <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'zh-CN'</span>;</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>

具体的文字映射表在:yii2\messages 文件夹下

5.后台菜单管理 
在views/layouts/main.php 中修改,通过items、label、url参数配置,其中url对应controller及内部的action的id; 
在items中还可以继续嵌套使用items,形成下拉菜单,如:

<code class="hljs php has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">   <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'items'</span> => [
            [<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'label'</span> => <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'首页'</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'url'</span> => [<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'/site/index'</span>]],
            [<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'label'</span> => <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'活动'</span>,
                <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'items'</span> =>[
                    [<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'label'</span> => <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'关于1'</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'url'</span> => [<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'/site/about'</span>]],
                    [<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'label'</span> => <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'关于2'</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'url'</span> => [<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'/site/about'</span>]],
                ],
            ],</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li></ul>

6.路由参数名的修改 
在yii使用过程中,实际开发可能需要修改路由规则,比如,当前需要将: 
http://api.test.com/?r=user/check&userid=xxx 修改为: 
http://api.test.com/?ID=user/check&userid=xxx 
可直接通过yii\web\UrlManager类来定义,只需要修改:

<code class="hljs cs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 指定不启用 enablePrettyUrl 情况下,URL中用于表示路由的查询参数,默认为 r</span>
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> $routeParam = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'ID'</span>;</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>

更深入了解yii2的路由,参考:http://www.digpage.com/request_response.html

数据库操作方法的优化

Yii2框架中,findAll方法的缺陷: 
首先它的属于基类BaseActiveRecorder;使用时要求必须有一个数组参数。 
因此,可以自己新建一个类,继承BaseActiveReccorder,并重写其findAll()方法: 
如下: 
这里写图片描述 
里面三个数组都可以是数组或字符串格式; 
同理可以重写其findOne()方法,只需在参数中的 limitreturn query->one();就可以了

深入理解Yii2中的view

首先,yii2 view在vendor/views中也是一个对象

一、render方法 
任意一个controller都有5种render方法: 
1.render(view文件名,待传递的参数数组);如:

<code class="hljs asciidoc has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-smartquote" style="box-sizing: border-box;">`render('</span>about',[<span class="hljs-emphasis" style="box-sizing: border-box;">'num'</span>=>5]) //表示带上num这个数据生成about.php页面,并将这个生成的结果当作content变量(字符串)传递到main.php布局文件中。在about.php文件中,可通过$num获取传递过来的参数`</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>

2.renderPartical(view文件名,待传递的参数数组)//不使用布局文件 
3.renderAjax(view文件名,代传递的参数数组); //显示完整的view,包括head body 
4.renderContent(view文件名) 
5.renderFile

注意:在controller的action中,1 = 2 + 3,即: 
$this->render('about',['num'=>5])的作用相当于:

<code class="hljs php has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$content</span> = <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$this</span>->renderPartical(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'about'</span>,[<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'num'</span>=><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">5</span>]);
<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$this</span>->renderContent(<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$content</span>);</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>

两个步骤的结果

二、view文件名可以写作如下格式: 
1.‘about’ //ViewContextInterface接口返回的view名 
2. @app/views/about.php //别名 
3. //views/site/about.php //代表当前app下的views文件夹,属于根目录下的views 
4. /views/site/about.php //代表当前module模块下的views 
5. getViewFile //返回上次render调用的view文件目录

三、view文件中使用js 或 css:

<code class="hljs ruby has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$this</span>->registerMetaTag(<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$options</span>);  
<span class="hljs-regexp" style="color: rgb(0, 136, 0); box-sizing: border-box;">//</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$options</span>的格式:数组如:[,name<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'=>'</span>author<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">','</span>content<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'=>'</span><span class="hljs-constant" style="box-sizing: border-box;">Someletters</span><span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">']</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>
<code class="hljs lasso has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$this</span><span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>registerLinkTag(<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$options</span>);   <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//参数也是数组格式的link内容</span>
<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$this</span><span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>registerCss(<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$css</span>);  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//参数是css代码,字符串格式</span>
<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$this</span><span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>registerCssFile(<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$url</span>);<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//参数是url地址</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>
<code class="hljs lasso has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$this</span><span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>registerJs(<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$js</span>,引入位置);<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//参数是js代码,字符串格式;</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>

引入位置有以下几种: 
POS_HEAD(head结束前); 
POS_BIGIN(body开始处); 
POS_END(body结束前); 
POS_READY(包括到jQuery中,表示文档加载后); 
POS_LOAD(包括到jquery中,文档加载时); 
通过View::POS_HEAD来书写该参数

<code class="hljs ruby has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$this</span>->registerJsFile(<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$url</span>,依赖及位置参数数组); 
<span class="hljs-regexp" style="color: rgb(0, 136, 0); box-sizing: border-box;">//</span>参数是url地址 和一个数组如[<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'denpends'</span>=>[<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'jquery.js'</span>,<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'x.js'</span>],<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'position'</span>=><span class="hljs-constant" style="box-sizing: border-box;">View::POS_HEAD</span>],表示在jquery.js 和 x.js之后加载,位置在头部</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>

生成顺序:meta –> link –> css file –> css code –> js file –> js code ;同类标签按加载的代码顺序生成; 
注意:

<code class="hljs lasso has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$this</span><span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>registerMetaTag(<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$options</span>,<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$key</span>); 
<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$this</span><span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>registerLinkTag(<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$options</span>,<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$key</span>);</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>

这两个方法,可以包含key参数(字符串),对于key相同的同种注册方法,后面加载的注册或覆盖前面加载的方法;

其中$this表示 yii\web\view对象,所以在view文件中,也可以使用render方法,可写作:

<code class="hljs xml has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="php" style="box-sizing: border-box;"><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"><?php</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">echo</span> <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$this</span>->render(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'error'</span>,[<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'name'</span>=><span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'err'</span>,<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'message'</span>=><span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'出错了'</span>]); <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">?></span></span> 
//需要注意的是,view文件中调用view,不会调用布局文件,而只是渲染调用的新的view文件;</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>

controller的所有render方法都是通过调用view对象的底层方法来实现

深入理解布局文件

布局文件: 
views/layouts/main.php 主要包括页面显示的头部(导航栏),尾部(footer)

一、自定义布局文件的使用: 
① 在controller的action中添加:

<code class="hljs mel has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$this</span>-><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">layout</span> = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'指定的布局文件'</span>;<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//不需要加php后缀名</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>
不同的action可以指定各自的布局文件。

② 让所有的action使用同一个布局文件: 
在controller中直接添加属性:

<code class="hljs cs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> $layout = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'统一的布局文件’;//不需要加php后缀名</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>

或 在controller初始化方法中定义:

<code class="hljs php has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">function</span> <span class="hljs-title" style="box-sizing: border-box;">init</span><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">()</span>{</span>
     <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">parent</span>::init();
     <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$this</span>->layout  =<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'main'</span>;
}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li></ul>

③ 不定义,则使用默认布局文件: 
  查找顺序如下: 
    先查看当前Controller中是否定义布局变量; 
    如果有就直接使用,否则会查找其所在Module模型中定义的布局变量; 
    如果还没有,会查找改module的父类Module中定义的布局变量;

④ layout变量的空值: 
    a. false,不使用布局文件; 
    b. null,使用当前module模块中的布局文件;

⑤ layout变量的值:与查找view文件类似 
    a.‘main’ //直接用字符串,表示当前module的布局文件 
    b. @app/views/layouts/main.php //别名 
    c.‘/main’ //加斜杠表示当前app下的布局文件

注意,布局文件可以层层嵌套,比如当前有个test.php的布局文件 
里面写法是:

<code class="hljs xml has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">    <span class="php" style="box-sizing: border-box;"><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"><?php</span> <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$this</span>->beginContent(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'@app/views/layouts/main.php'</span>,[<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'需要传递的变量'</span> => 变量值]);<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">?></span></span>
      <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">div</span>></span>......<span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"></<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">div</span>></span>
      <span class="php" style="box-sizing: border-box;"><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"><?php</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">echo</span> <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$content</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">?></span></span>

    <span class="php" style="box-sizing: border-box;"><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"><?php</span> <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$this</span>->endContent(); <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">?></span></span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li></ul>

其工作过程是:view文件render过来产生的content变量,先在这个test.php中渲染, 
渲染的结果又作为一个新的content在当前app下的main.php布局文件中渲染;

二、布局的更高级用法: 
yii2默认只能在布局文件中接收一个名称为$content的变量,这个变量是render指定的view文件产生的; 
现在可以通过在view文件中写以下代码传递多个变量给布局文件渲染:

<code class="hljs xml has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">    <span class="php" style="box-sizing: border-box;"><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"><?php</span>
        <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$this</span>->blocks[<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'content'</span>] = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">''</span>;
        <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$this</span>->blocks[<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'other'</span>] = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">''</span>;
    <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">?></span></span>

    <span class="php" style="box-sizing: border-box;"><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"><?php</span> InhritLayout::begin([<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'viewFile'</span> => <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'@app/views/layouts/main.php'</span>]); <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">?></span></span>    
        <span class="php" style="box-sizing: border-box;"><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"><?php</span> <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$this</span>->beginBlock(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'contetn'</span>);<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">?></span></span>
                这里是指定的content需要传递的变量
        <span class="php" style="box-sizing: border-box;"><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"><?php</span> <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$this</span>->endBlock(); <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">?></span></span>

        <span class="php" style="box-sizing: border-box;"><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"><?php</span> <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$this</span>->beginBlock(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'other'</span>);<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">?></span></span>
                这里是额外要在布局文件中渲染的东西
        <span class="php" style="box-sizing: border-box;"><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"><?php</span> <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$this</span>->endBlock(); <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">?></span></span> 
    <span class="php" style="box-sizing: border-box;"><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"><?php</span> InhritLayout::end(); <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">?></span></span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li></ul>

最后在布局文件中,获取。 
详细参考: 
http://github.com/yiifans/lulucms/blob/master/components/widgets/InhriLayout.php

view、widget、controllder之间的数据传递

1.controller中的变量传递给view文件 
① 通过render方法中数组的方式传递 
② 在action中通过view对象 用属性赋值,如下:

<code class="hljs bash has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">        <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$view</span> = \Yii::<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$app</span>->getView();
        <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$view</span>->params[<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'待传递的变量名'</span>] = 变量值;</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>
 然后在view文件中,直接用`$this->params['传递的变量名'];` 来获取
 同理,这个方法可以在layouts布局文件中获取该变量;

③ 在view文件中 通过context上下文来设置变量值:

<code class="hljs lasso has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">        <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$context</span> <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$this</span><span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>context;<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//该上下文就包含有当前的controller</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>
 然后,直接在view的div或其他html元素中输出:
<code class="hljs xml has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">    <span class="php" style="box-sizing: border-box;"><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"><?php</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">echo</span> <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$context</span>->controller中定义的变量名; <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">?></span></span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>
 此外,context还可以调用当前controller中的action方法;
 如:在view文件中使用:$context->actionIndex();

2.widget组件也可以使用view对象,使用render方法,context也可以指向当前的widget组件

Yii2框架提供App接口,post请求入口文件

通常Yii2用来写web应用,非常轻松,无论从思想上,和易用性上,都是非常理想的选择。 
     但于在写web框架时,不需要考虑将controller和action作为参数来提交,而是直接写在URL地址中,使用get方式去请求得到响应,使用场景就比较限制。 
     因为controller 和 action会一直变化,app客户端又希望可以将url中不变的部分,单独抽离出来放到底层方法里,所以就有可能要将controller或action本身作为参数来get或者post请求。 
     注意,通常所说Yii2由于Csrf限制不能post指的是action中的post,而实际上,往action中post参数是非常容易实现的。本文中提到的post,是post控制器ID 和 action 的ID给框架的入口文件。

本文提供两种思路:

一、通过修改路由解析和生成规则 
     由于Yii2框架的入口文件 web\index.php 只做了 生成Application和利用配置参数调用其run方法两个步骤,入口文件本身没有任何接收参数的操作,之后将url地址交给路由解析来查找对应的controller和action。因此,要想通过post来获取controller和action就需要修改底层路由规则。 
     这里有相关深入的源码解析,本文不做赘述:Yii2路由

二、自己手写一个入口文件,再交给Yii来处理 
     这个方法相对来说,思路清晰,操作简便,在不动源码的情况下,可以完美实现:客户端用post方式提交controller和action乃至其他参数给自己的,获取服务端响应。 
注:由于我本身对url做的一点点修改,原来路由参数名r改成了ID 
     具体操作方法如下: 
     ①自己新建一个入口文件index.php

<code class="hljs php has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">    <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"><?php</span>
    <span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">function</span> <span class="hljs-title" style="box-sizing: border-box;">toUrl</span><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">(<span class="hljs-variable" style="box-sizing: border-box;">$url</span>)</span>{</span>
            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//初始化curl</span>
            <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$ch</span> = curl_init(<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$url</span>) ;
            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 获取数据返回</span>
            curl_setopt(<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$ch</span>, CURLOPT_RETURNTRANSFER, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">true</span>) ;
            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 在启用 CURLOPT_RETURNTRANSFER 时候将获取数据返回</span>
            curl_setopt(<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$ch</span>, CURLOPT_BINARYTRANSFER, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">true</span>) ;
            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//输出返回的参数</span>
            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">echo</span> curl_exec(<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$ch</span>) ;
    }

    <span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">function</span> <span class="hljs-title" style="box-sizing: border-box;">html</span><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">(<span class="hljs-variable" style="box-sizing: border-box;">$controllerid</span>,<span class="hljs-variable" style="box-sizing: border-box;">$actionid</span>,<span class="hljs-variable" style="box-sizing: border-box;">$paramArr</span>)</span>{</span>
        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//基础路由拼接url</span>
        <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$url</span> = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"http://api.xxxx.cn/entry.php?ID="</span>.<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$controllerid</span>.<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"/"</span>.<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$actionid</span>;
        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//先遍历获取参数,这里没有校验参数,偷懒了,参考者请自觉补充</span>
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span>(<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$i</span>=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$i</span><count(<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$paramArr</span>);<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$i</span>++){
            <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$paramName</span> = <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$paramArr</span>[<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$i</span>];                  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//获取参数名</span>
            <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$paramValue</span> = <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$_REQUEST</span>[<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$paramName</span>];         <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//获取参数值</span>
            <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$url</span> = <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$url</span>.<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"&"</span>.<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$paramName</span>.<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"="</span>.<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$paramValue</span>;  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//拼接url地址</span>
        }
        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//用curl 做get请求</span>
        toUrl(<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$url</span>);
    }

    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//接收客户端post过来的参数ID</span>
    <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$ID</span> = <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$_REQUEST</span>[<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'ID'</span>];

    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//根据参数,做curl跳转到Yii2的入口文件</span>
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">switch</span>(<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$ID</span>){
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'creditplace'</span>:
            <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$paramArr</span> = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">array</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'token'</span>);
            html(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'userbase'</span>,<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$ID</span>,<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$paramArr</span>);
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">break</span>;
        ......
    <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">?></span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li></ul>

     ②修改Yii原本的入口文件web\index.php 文件名为:entry.php,代码本身不做修改。

另外,Yii2还提供了使用Restful写app接口,具体,我学习和使用后再做更新。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值