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()方法,只需在参数中的
limit去掉,最后return
query->one();就可以了
首先,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
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接口,具体,我学习和使用后再做更新。