重学YII2--基础篇

安装配置

如果服务器是Apache,使用下列配置文件,在配置RESTFul API的时候还会结合.htaccess隐藏index.php,更多

1
DocumentRoot "path/to/basic/web"

<Directory "path/to/basic/web">

    RewriteEngine on

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d

    RewriteRule . index.php

</Directory>

如果使用nginx,则使用下述配置,更多nginx配置相关可以查看另一博文升级php&配置LNMPR环境

1
server {
    charset utf-8;
    client_max_body_size 128M;

    listen 80;


    server_name mysite.local;
    root        /path/to/basic/web;
    index       index.php;

    access_log  /path/to/basic/log/access.log main;
    error_log   /path/to/basic/log/error.log;

    location / {

        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        include fastcgi.conf;
        fastcgi_pass   127.0.0.1:9000;

        try_files $uri =404;
    }

    location ~ /\.(ht|svn|git) {
        deny all;
    }
}

入门注意事项

  1. 控制器名称对应关系 post-comment => PostCommentController
  2. 控制器中操作名称的对应关系 create-commnet => actionCreateComment
  3. 控制器中的参数是从请求的参数中寻找并传递,并且经过yii\helpers\Html::encode()处理防止XSS攻击。
  4. 表单验证失败使用getErrors()获取错误详情
  5. 用户提交表单以及验证的处理还需要使用yii\web\Controller::refresh()或者yii\web\Controller::redirect()去避免表单重复提交
  6. 在部署到服务器上时需要调整运行环境为pro,也就是需要修改yii,frontend\public\index.php,backend\public\index.php文件
1
2
3
4
<?php
//将YII_DEBUG常量置为false,YII_ENV调整为prod
defined('YII_DEBUG') or define('YII_DEBUG', false);
defined('YII_ENV') or define('YII_ENV', 'prod');
  1. bootstrap数组中的每个组件都需要指定’应用组件ID’,’模块ID’,’类名’,’配置数组’,’创建并返回一个组件的匿名函数’

  2. yii\web\Application::catchAll指定一个处理所有用户请求的控制器方法

1
2
3
4
5
6
7
[
'catchAll' => [
'offline/notice',
'param1' => 'value1',
'param2' => 'value2',
],
]
  1. 控制器映射
1
2
3
4
5
6
7
8
9
10
11
[
'controllerMap' => [
[
'account' => 'app\controllers\UserController',
'article' => [
'class' => 'app\controllers\PostController',
'enableCsrfValidation' => false,
],
],
],
]
  1. 模块配置
1
2
3
4
5
6
7
8
9
10
11
12
[
'modules' => [
// "booking" 模块以及对应的类
'booking' => 'app\modules\booking\BookingModule',

// "comment" 模块以及对应的配置数组
'comment' => [
'class' => 'app\modules\comment\CommentModule',
'db' => 'db',
],
],
]
  1. defaultRoute默认路由配置
  2. 安装了新的扩展可以使用extensions,默认使用@vendor/yiisoft/extensions.php由composer进行自动维护
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[
'extensions' => [
[
'name' => 'extension name',
'version' => 'version number',
'bootstrap' => 'BootstrapClassName', // 可选配,可为配置数组
'alias' => [ // 可选配
'@alias1' => 'to/path1',
'@alias2' => 'to/path2',
],
],

// ... 更多像上面的扩展 ...

],
]
  1. 应用事件
1
2
3
4
5
6
7
8
9
10
[
'on beforeRequest' => function ($event) {
// ...
$event->isValid = false; //停止后续动作
},
]
//引导阶段可以使用下列代码
\Yii::$app->on(\yii\base\Application::EVENT_BEFORE_REQUEST, function ($event) {
// ...
});
  1. 核心组件(之前未注意的)

    yii\base\Application::errorHandler: 处理 PHP 错误和异常
    yii\log\Dispatcher: 管理日志对象
    yii\web\View: 支持渲染视图
    yii\swiftmailer\Mailer: 支持生成邮件结构并发送
    yii\i18n\Formatter: 格式化输出显示给终端用户的数据

控制器相关

  1. 控制器也是可以分目录的 admin/admin
  2. 控制器中的action分为两种:内联,独立。前者为常见常用的actionIndex,后者为继承自
    ```的类,可以被多个控制器重用,可以参考``` yii\web\ViewAction ```和``` yii\web\ErrorAction ```,实现起来也比较简单public function run()
    1
    3. 对于上面的独立action的返回值可以为响应对象。对于web将任意数据填充给```yii\web\Response::data

模型相关

  1. model支持块赋值和自定义格式的数据导出
  2. 在ArrayAccess数组访问和ArrayIterator数组迭代器的支持下,属性可以像数组一样访问并使用foreach迭代
  3. 场景的设置
1
2
3
4
5
// 场景作为属性来设置
$model = new User;
$model->scenario = 'login';
// 场景通过构造初始化配置来设置
$model = new User(['scenario' => 'login']);
  1. 保留默认场景
1
2
3
4
5
6
7
public function scenarios()
{

$scenarios = parent::scenarios();
$scenarios['login'] = ['username', 'password'];
$scenarios['register'] = ['username', 'email', 'password'];
return $scenarios;
}
  1. 使用

    ```去转换数据并格式化
    1
    6. fields可以添加过滤一些字段
    7. 高级模板中可以在common中定义基类,前后台各自继承
    
    # 视图
    1. ``` echo \Yii::$app->view->renderFile('@app/views/site/license.php');

  2. 试图文件中获取控制器ID

    ```
    1
    3. 视图中可以定义数据块
    ```php
    <?php $this->beginBlock('block1'); ?>
    ...content of block1...
    <?php $this->endBlock(); ?>

  3. ``` ``` yii\web\View::registerLinkTag() ```
    1
    5. > yii\base\View::EVENT_BEFORE_RENDER: 在控制器渲染文件开始时触发, 该事件可设置 yii\base\ViewEvent::isValid 为 false 取消视图渲染。
       
       > yii\base\View::EVENT_AFTER_RENDER: 在布局中调用 yii\base\View::beginPage() 时触发, 该事件可获取yii\base\ViewEvent::output的渲染结果,可修改该属性来修改渲染结果。
       > yii\base\View::EVENT_BEGIN_PAGE: 在布局调用 yii\base\View::beginPage() 时触发;
       > yii\base\View::EVENT_END_PAGE: 在布局调用 yii\base\View::endPage() 是触发;
       > yii\web\View::EVENT_BEGIN_BODY: 在布局调用 yii\web\View::beginBody() 时触发;
       > yii\web\View::EVENT_END_BODY: 在布局调用 yii\web\View::endBody() 时触发。
    
    # 模块
    1. init初始化方法
    
    ```php
    // 从config.php加载配置来初始化模块
    \Yii::configure($this, require(__DIR__ . '/config.php'));
  4. 获取模块实例

1
2
3
4
5
$module = MyModuleClass::getInstance();
// 获取ID为 "forum" 的模块
$module = \Yii::$app->getModule('forum');
// 获取处理当前请求控制器所属的模块
$module = \Yii::$app->controller->module;
  1. 模块可以嵌套,但是子模块需要在父模块的modules属性中有所说明

过滤器

  1. 本质是一种行为

小部件

  1. 自定义小部件继承yii\base\Widget并覆盖init run方法即可创建

Assets

  1. source

其他补充

  1. 使用i18n进行翻译时,可以使用的category有两个:yii app,分别在各自的@yii @app目录下建立messages文件夹,里面对应建立语言文件夹zh-CN,再里面放置yii.php app.php,返回键值对应的一维数组

数据展示

数据格式化

1.