>对一些概念的理解
--入口脚本:终端能够直接访问的PHP脚本,负责启动以个请求处理周期(怎样防止其它页面被用户直接通过URL访问)
--应用:能全局范围内访问的对象(Yii::$app),管理协调组件未来完成请求。
--应用组件:在应用中注册的对象,提供不同的功能来完成请求。
--模块:包含MVC结构的独立包,一个应用可以有多个模型组建
--过滤器,控制器在处理请求之前或之后,需要出发执行的代码
--小部件:可嵌入到视图中的对象,包含控制器逻辑,可以被不同视图重用
>入口脚本
特点:放在根目录下,该文件需要有执行权限
入口脚本的作用:
定义全局常量
注册composer自动加载器
包含yii的类文件
加载应用配置
创建一个应用实例并配置
调用yii\base\application::run()来处理请求
>应用主体(为每次运行生成的已给对象,完美的记住了对象主体的全局属性)
>>作用:管理yii应用系统整体结构和生命周期的对象,每个yii含有一个应用主体,应用主体在入口脚本中创建,并能通过表达式Yii::$app全局访问
>>yii有两种应用主体,yii\web\application和yii\console\application,前者处理网页请求,后者处理控制条请求
--对他的作用机理还是不是太清楚,坑能就是包含了很多奇怪的属性定义吧,以后回来解决
>应用组件
>>应用主体是服务定位器,他不熟一组提供各种不同功能的应用组件爱处理请求,urlManager组件负责处理网页请求路由到对应的服务器,db组件提供数据库相关服务等。
>>每个应用组件都有一个id来区分其他组件,
Yii::$app->componetID
Yii::$app->db访问注册到应用的数据库连接
Yii::$app->cache获取到已注册到应用的cache
--核心应用组件、引导启动应用组件比较高深,难以理解,以后回来解决
>控制器
>>控制器继承controller类的对象,负责处理请求和生成响应,从应用主体接管控制后会分析请求数据并传送到模型,传送模型结果到视图,最后生成相应信息。
>>操作,控制器中的一系列action函数,view事件->触发请求->接受请求->数据填入模型->保存模型->反馈数据->响应到视图渲染
>>路由 通过r寻找操作
>>创建控制器namespace定义了能够访问的controller下的其它控制器
假设yii\base\Application::controllerNamespace 控制器命名空间为 app\controllers
:
article
对应app\controllers\ArticleController
;post-comment
对应app\controllers\PostCommentController
;admin/post-comment
对应app\controllers\admin\PostCommentController
;adminPanels/post-comment
对应app\controllers\adminPanels\PostCommentController
.
>>控制器的ID有点像控制器文件的url路径中的名称
>>操作ID,action的子类,以action类开头。
内联操作,在控制器类中定义方法,独立操作继承控制器中的子类,内联操作容易创建,在无需冲用的情况下优先使用。
独立操作,继承yii\base\action或他的子类。主要用于多重控制器重用
>>内联操作
操作方法的名字是根据操作ID遵循如下规则衍生:
- 将每个单词的第一个字母转为大写;
- 去掉中横杠;
- 增加
action
前缀.
例如index
转成 actionIndex
, hello-world
转成 actionHelloWorld
。
<span style="font-size:14px;"><?php
namespace app\components;
use yii\base\Action;
class HelloWorldAction extends Action
{
public function run()
{
return "Hello World";
}
}</span>
>>操作参数
内联操作和独立操作都可以带参数,参数从请求中获得,参数值从$_GET
<span style="font-size:14px;">namespace app\controllers;
use yii\web\Controller;
class PostController extends Controller
{
public function actionView($id, $version = null)
{
// ...
}
}</span>
http://hostname/index.php?r=post/view&id=123
:$id
会填入'123'
,$version
仍为 null 空因为没有version
请求参数;http://hostname/index.php?r=post/view&id=123&version=2
: $id和
$version分别填入
'123'和
'2'`;http://hostname/index.php?r=post/view
: 会抛出yii\web\BadRequestHttpException 异常 因为请求没有提供参数给必须赋值参数$id
;http://hostname/index.php?r=post/view&id[]=123
: 会抛出yii\web\BadRequestHttpException 异常 因为$id
参数收到数字值['123']
而不是字符串.
>>默认操作
每一个控制器路径下也都有一个默认的控制器(所以刚才访问时,只要填写到task文件夹下,就会自动执行其中默认控制器下的默认操作)
每一个控制器都有一个默认操作,可以直接修改
publice $defaultAction = 'home'/修改了默认操作的名称
>>控制器声明周期,及控制的处理请求的步骤
控制器创建配置后,init方法调用
控制器根据操作id创建一个操作对象
控制器按书序调用应用主体、模块、控制器before方法
控制器执行操作
控制器按顺序调用控制器模块,应用主体的方法
应用主体获取操作结果并响应
>>作用归纳
控制器
//对于behavior还不是很理解呀!
>controller 类的应用补充
>>$actionParams 数组 定义了当前动作的参数
$defautAction = 'home' 字符串 定义了默认的动作名称
$id 字符串 定义了控制器的id
$layout 字符串或者布尔型 定义默认的控制器布局
$module 这个控制器属于的模型
$rout string 当前路由(模型id控制器id和动作id)
$viewPath 包含控制器的视图文件
方法:
>>action系列方法
afterAction()动作被执行后
beforeAction()动作被执行前,用来决定动作是否被执行
<span style="font-size:14px;">public function beforeAction($action)
{
if (parent::beforeAction($action)) {
// your custom code here
return true; // or false if needed
} else {
return false;
}
}</span>
>>behavior系列方法
behavior()
beforebehavior()
afterbehavior()
attachBehaviors()
attachBehavior()
detachBehavior()
detachBehaviors()
ensereBehaviors()
getBehavior()
getBehaviors()
>>get系列方法
getModules()得到模型
getRoute()当前请求的路由
getUniqueld()
getView()得到视图对象,能够使用它渲染
getViewPath()得到视图路径
>>redirect系列方法
goback() redirect the browser to the last visited page
gohome() redirects the browser to the homepage
redirect($url,$statusCode) redirects the browser to the specified URL.
refresh() refresh the current page
>>render系列方法
render() 传递给视图或者布局进行渲染
renderAjax($view,$params=[]) 传递给视图,响应一个AJAX请求 it will inject into the rendering result with JS/CSS scripts and files which are registered with the view
renderContent()粗啊你的一个静态字符串,通过申请一个一个布局
renderFile() 传递给一个视图文件夹
renderPartial()传递给视图,不包括布局文件