**YII** 系列八应用结构

来源:互联网 发布:都玩网络ko三国 编辑:程序博客网 时间:2024/04/28 06:51

>对一些概念的理解


--入口脚本:终端能够直接访问的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 转成 actionIndexhello-world 转成 actionHelloWorld

>>独立操作

<span style="font-size:14px;"><?phpnamespace 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方法

控制器执行操作

控制器按顺序调用控制器模块,应用主体的方法

应用主体获取操作结果并响应

>>作用归纳

控制器

  • 可访问 请求 数据;
  • 可根据请求数据调用 模型 的方法和其他服务组件;
  • 可使用 视图 构造响应;
  • 不应处理应被模型处理的请求数据;
  • 应避免嵌入HTML或其他展示代码,这些代码最好在 视图中处理.

//对于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()传递给视图,不包括布局文件

0 0
原创粉丝点击