天天看点

yii框架学习1

https://www.yiichina.com/doc/guide/2.0

一、安装

composer create-project --prefer-dist yiisoft/yii2-app-basic basic
           

二、指向根目录

web

三、访问

http://localhost/

四、创建方法、视频并访问(默认)

在controllers/SiteController.php新加方法

public function actionSay(){
        return $this->render('say',['message'=>'message news']);
    }
           

say 操作被定义为 actionSay 方法。 Yii 使用 action 前缀区分普通方法和操作。 action 前缀后面的名称被映射为操作的 ID。

在views/site文件夹下新建say.php

代码如下:

<?php
use yii\helpers\Html;
?>
<?=Html::encode($message) ?>
           

say 视图应该存为 views/site/say.php 文件。当一个操作中调用了 render() 方法时, 它将会按 views/控制器 ID/视图名.php 路径加载 PHP 文件。

五、获取地址栏参数

文档给出系统会自动获取,只需要在方法括号里面加对应参数就行了,我也不知道为什么

public function actionSay($message = 'Hello')
    {
        return $this->render('say', ['message' => $message]);
    }
           

前端代码:

<?php
use yii\helpers\Html;
?>
<?=Html::encode($message) ?>
           

访问地址:http://localhost/index.php?r=site/say&message=holle+world

yii框架学习1

控制器生命周期

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

在控制器创建和配置后,yii\base\Controller::init() 方法会被调用。

控制器根据请求操作ID创建一个操作对象:

如果操作ID没有指定,会使用default action ID默认操作ID;

如果在action map找到操作ID, 会创建一个独立操作;

如果操作ID对应操作方法,会创建一个内联操作;

否则会抛出yii\base\InvalidRouteException异常。

控制器按顺序调用应用主体、模块(如果控制器属于模块)、 控制器的 beforeAction() 方法;

如果任意一个调用返回false,后面未调用的beforeAction()会跳过并且操作执行会被取消; action execution will be cancelled.

默认情况下每个 beforeAction() 方法会触发一个 beforeAction 事件,在事件中你可以追加事件处理操作;

控制器执行操作:

请求数据解析和填入到操作参数;

控制器按顺序调用控制器、模块(如果控制器属于模块)、应用主体的 afterAction() 方法;

默认情况下每个 afterAction() 方法会触发一个 afterAction 事件, 在事件中你可以追加事件处理操作;

应用主体获取操作结果并赋值给响应.

视图名

渲染视图时,可指定一个视图名或视图文件路径/别名,大多数情况下使用前者因为前者简洁灵活, 我们称用名字的视图为 视图名.

视图名可以依据以下规则到对应的视图文件路径:

视图名可省略文件扩展名,这种情况下使用 .php 作为扩展, 视图名 about 对应到 about.php 文件名;

视图名以双斜杠 // 开头,对应的视图文件路径为 @app/views/ViewName, 也就是说视图文件在 application’s view path 路径下找, 例如 //site/about 对应到 @app/views/site/about.php。

视图名以单斜杠/开始,视图文件路径以当前使用模块 的view path开始, 如果不存在模块,使用@app/views/ViewName开始,例如,如果当前模块为user, /user/create 对应成 @app/modules/user/views/user/create.php, 如果不在模块中,/user/create对应@app/views/user/create.php。

如果 context 渲染视图 并且上下文实现了 yii\base\ViewContextInterface, 视图文件路径由上下文的 view path 开始, 这种主要用在控制器和小部件中渲染视图,例如 如果上下文为控制器SiteController,site/about 对应到 @app/views/site/about.php。

如果视图渲染另一个视图,包含另一个视图文件的目录以当前视图的文件路径开始, 例如被视图@app/views/post/index.php 渲染的 item 对应到 @app/views/post/item。

根据以上规则,在控制器中 app\controllers\PostController 调用 $this->render(‘view’), 实际上渲染 @app/views/post/view.php 视图文件,当在该视图文件中调用 $this->render(’_overview’) 会渲染 @app/views/post/_overview.php 视图文件。

布局

布局是一种特殊的视图,代表多个视图的公共部分, 例如,大多数Web应用共享相同的页头和页尾, 在每个视图中重复相同的页头和页尾,更好的方式是将这些公共放到一个布局中, 渲染内容视图后在合适的地方嵌入到布局中。

创建布局

由于布局也是视图,它可像普通视图一样创建,布局默认存储在@app/views/layouts路径下, 模块中使用的布局应存储在 module directory模块目录 下的views/layouts路径下, 可配置yii\base\Module::$layoutPath来自定义应用或模块的布局默认路径。

如下示例为一个布局大致内容,注意作为示例,简化了很多代码, 在实际中,你可能想添加更多内容,如头部标签,主菜单等。

<?php
use yii\helpers\Html;

/* @var $this yii\web\View */
/* @var $content string 字符串 */
?>
<?php $this->beginPage() ?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8"/>
    <?= Html::csrfMetaTags() ?>
    <title><?= Html::encode($this->title) ?></title>
    <?php $this->head() ?>
</head>
<body>
<?php $this->beginBody() ?>
    <header>My Company</header>
    <?= $content ?>
    <footer>&copy; 2014 by My Company</footer>
<?php $this->endBody() ?>
</body>
</html>
<?php $this->endPage() ?>
           

如上所示,布局生成每个页面通用的HTML标签,在标签中,打印$content变量, $content变量代表当yii\base\Controller::render() 控制器渲染方法调用时传递到布局的内容视图渲染结果。

大多数视图应调用上述代码中的如下方法, 这些方法触发关于渲染过程的事件, 这样其他地方注册的脚本和标签会添加到这些方法调用的地方。

它触发表明页面开始的 EVENT_BEGIN_PAGE 事件。

它触发表明页面结尾的 EVENT_END_PAGE 事件。

它生成一个占位符,在页面渲染结束时会被注册的头部HTML代码 (如,link标签, meta标签)替换。

它触发 EVENT_BEGIN_BODY 事件并生成一个占位符, 会被注册的HTML代码(如JavaScript)在页面主体开始处替换。

它触发 EVENT_END_BODY 事件并生成一个占位符, 会被注册的HTML代码(如JavaScript)在页面主体结尾处替换。

布局中访问数据

在布局中可访问两个预定义变量:$this 和 $content, 前者对应和普通视图类似的view 视图组件 后者包含调用render()方法渲染内容视图的结果。

如果想在布局中访问其他数据,必须使用视图中访问数据一节介绍的拉取方式, 如果想从内容视图中传递数据到布局, 可使用视图间共享数据一节中的方法。

使用布局

如控制器中渲染一节描述, 当控制器调用render() 方法渲染视图时,会同时使用布局到渲染结果中,默认会使用@app/views/layouts/main.php布局文件。

可配置yii\base\Application::KaTeX parse error: Undefined control sequence: \base at position 13: layout 或 yii\̲b̲a̲s̲e̲\Controller::layout 使用其他布局文件, 前者管理所有控制器的布局,后者覆盖前者来控制单个控制器布局。 例如,如下代码使 post 控制器渲染视图时使用 @app/views/layouts/post.php 作为布局文件, 假如 layout 属性没改变, 控制器默认使用 @app/views/layouts/main.php 作为布局文件。

namespace app\controllers;

use yii\web\Controller;

class PostController extends Controller
{
    public $layout = 'post';
    
    // ...
}
           

视图事件

View components 视图组件会在视图渲染过程中触发几个事件, 可以在内容发送给终端用户前,响应这些事件来添加内容到视图中或调整渲染结果。

该事件可设置 yii\base\ViewEvent::$isValid 为 false 取消视图渲染。

EVENT_AFTER_RENDER: 在布局中调用 yii\base\View::afterRender() 时触发, 该事件可获取yii\base\ViewEvent::$output的渲染结果, 可修改该属性来修改渲染结果。

EVENT_BEGIN_PAGE: 在布局调用 yii\base\View::beginPage() 时触发;

EVENT_END_PAGE: 在布局调用 yii\base\View::endPage() 是触发;

EVENT_BEGIN_BODY: 在布局调用 yii\web\View::beginBody() 时触发;

EVENT_END_BODY: 在布局调用 yii\web\View::endBody() 时触发。

例如,如下代码将当前日期添加到页面结尾处:

\Yii::$app->view->on(View::EVENT_END_BODY, function () {
    echo date('Y-m-d');
});
           

m o d e l − > l o a d ( model->load( model−>load(data) 返回false 可以尝试

$model->attributes = $data;
// 或者
$model->setAttributes($data);