yii2 知识集锦

2016-07-01 鲁鲁槟 1

一、杂碎

1.1、类的映射表机制 

\YII::$classMap

1.2、POS_HEAD 等的位置

yii\web\View::POS_HEAD 头部
yii\web\View::POS_BEGIN 刚打开 <body> 后
yii\web\View::POS_END 刚关闭 </body> 前
yii\web\View::POS_READY 文档 ready事件 执行代码时
yii\web\View::POS_LOAD 文档 load 事件执行代码

1.3、自动登录

自动登录是根据cookie,获取 cookie 中用户 id,然后去数据库获取用户信息。

然后在查询出来的用户信息中 auth_key 和 cookie 中的 auth_key 进行匹配,在改密码后,会改 auth_key 字段的内容,匹配失败,要重新登录。

1.4、yii2 Behavior

use yii\behaviors\AttributeBehavior;
use yii\behaviors\SluggableBehavior;
use yii\behaviors\BlameableBehavior;
use yii\behaviors\TimestampBehavior;
use yii\db\ActiveRecord;

public function behaviors()
    {
        return [
            [
                "class"      => AttributeBehavior::className(),
                "attributes" => [
                    ActiveRecord::EVENT_BEFORE_INSERT => "status",
                    // ActiveRecord::EVENT_BEFORE_UPDATE => "attribute2",
                ],
                "value"      => function ($event) {
                    return "10";//填充值
                },
            ],
            [
                /**
                 * TimestampBehavior:
                 * 创建的时候,默认插入当前时间戳给created_at和updated_at字段
                 * 更新的时候,默认更新当前时间戳给updated_at字段
                 */
                "class"              => TimestampBehavior::className(),
                "createdAtAttribute" => "created_at",
                "updatedAtAttribute" => "updated_at",
                // "value"              => time(),
            ],
            [
                /**
                 * SluggableBehavior:
                 * 算是美化url的一种方法
                 * 通过填写title自动填充字段slug
                 * slug替换原本url中的参数部分,可以增加url的安全性。
                 */
                "class"         => SluggableBehavior::className(),
                "attribute"     => "title",
                "slugAttribute" => "slug",
            ],
            [
                /**
                 * BlameableBehavior:
                 * 创建的时候,默认插入当前用户ID给author_id和updater_id字段
                 * 更新的时候,默认更新当前用户ID给updater_id字段
                 */
                "class"              => BlameableBehavior::className(),
                "createdByAttribute" => "author_id",
                "updatedByAttribute" => "updater_id",
                // "value"              => Yii::$app->user->id,
            ],
        ];
    }

1.5、yii2 模块化

1.6、yii2 使用 TimestampBehavior 

自动填充 created_at、updated_at

①、created_at 和 updated_at 字段属性是 int 时,可使用默认自动填充

use yii\behaviors\TimestampBehavior;
public function behaviors()
{
     return [
         TimestampBehavior::className(),
        "createdAtAttribute" => "created_at", //默认的字段是created_at和updated_at
        "updatedAtAttribute" => "updated_at", //如果没有updated_at字段,则写为false
     ];
}

②、created_at 和 updated_at 字段属性是 timestamp 时,可使用如下方法自动填充

use yii\db\Expression;
use yii\behaviors\TimestampBehavior;
public function behaviors()
{
     return [
         [
             "class" => TimestampBehavior::className(),
             "createdAtAttribute" => "created_at",
             "updatedAtAttribute" => "updated_at",
             "value" => new Expression("NOW()"),
         ],
     ];
}

1.7、yii2 的 render 方法

①、render($view):查找 view 文件的5种方式

在 yii\base\View 中findViewFile() 定义匹配规则

A、别名开头,路径指定 view 文件:@app/views/site/about(.php)

B、//开头,使用 app 目录下的 view://site/about

C、/开头,使用当前 Module 中的 views:/site/about

D、直接使用字符串(重要)

  • 在 Controller 中调用 render:如 $this->render('about')

Controller::render 会调用 View::render 方法

  • 在 View 中调用 render,所使用的 view 是当前 view 所在的目录

如:在 about.php 中 render('error',['name'=>'name','message'=>'message'])?>error 文件是 about.php 所在目录 site 下面的 error.php

②、render、renderPartial、renderContent、renderAjax、renderFile

A、render 显示 view 和 layout

B、renderPartial 只显示 view

C、renderContent 只渲染 layout

D、renderFile 显示指定的文件,是最基础的方法,renderAjax、renderPartial 最终都是调用 renderFile

E、renderAjax 只显示view,以 ajax 方式渲染页面,可以配合 js/css 实现各种特效

1.8、利用 yii2 advanced 创建自己的前后台项目名称

①、针对 backend 和 frontend 文件夹的修改:

修改 backend 为 lulu-backend、frontend 为 lulu-frontend

②、修改 common/config/bootstrap.php 中的别名

Yii::setAlias('@frontend', dirname(dirname(__DIR__)) . '/lulu-frontend');

Yii::setAlias('@backend', dirname(dirname(__DIR__)) . '/lulu-backend');

③、针对 environments 文件夹的修改:

A、替换 environments/index.php 中所有的 frontend 为 lulu-frontend,所有的 backend 为 lulu-backend

B、修改 environments/dev/backend 为 lulu-backend、frontend 为 lulu-frontend

C、修改 environments/dev/common/main-local.php 中的数据库配置信息

D、environments/prod 的修改与 environments/dev 的修改一样

④ 运行根目录下的 yii.bat

⑤ 针对 lulu-backend 和 lulu-frontend 的修改:

如果第2步骤中定义的别名不是@frontend、@backend,那么要修改assets、controllers、models中php文件的命名空间

1.9、yii2 提交表单提示无法验证

①、问题来源

使用Yii表单生成页面的时候,如果表单的提交方式为 POST,是都会在页面中添加一个隐藏字段,这个隐藏字段就是CSRF令牌验证字段。

用户在提交表单的同时,将该字段提交给服务器端,Yii 框架会将该有客户端提交过来的隐藏字段和客户端提交过来的 Cookie 中的 YII_CSRF_TOKEN 值进行比较。

相同则通过继续执行,不相同则会抛出 400 异常:"The CSRF token could not be verified."。

所以就出现了上面的问题,如果是自己写的表单,可以在视图页面的表单添加隐藏的令牌验证字段。

②、解决方法

A、第一种解决办法是关闭 Csrf

public function init()
{
    $this->enableCsrfValidation = false;
}
//或者
public function __construct($id, $module, $config = [])
{
    $this->menuActive = 2;
    $this->enableCsrfValidation = false;
    parent::__construct($id, $module, $config);     
          
}
//或者在配置文件中关闭
'components'=>array(
    'request'=>array(
        'enableCsrfValidation' => true,
    ),
),
//总之把 enableCsrfValidation 设为 false 就可以了

B、第二种解决办法是在 form 表单中加入隐藏域

<input name="_csrf" type="hidden" id="_csrf" value="<?= Yii::$app->request->csrfToken ?>">

C、第三种解决办法是在 AJAX 中加入 _csrf 字段

var csrfToken = $('meta[name="csrf-token"]').attr("content");
$.ajax({
    type: 'POST',
    url: url,
    data: {
        _csrf:csrfToken
    },
})

1.10、yii2 发送邮件

1.11、yii2 Activeform 表单部分组件使用方法

<?php $form = ActiveForm::begin(['action' => ['test/getpost'],'method'=>'post']); ?>
 
<?=$form->field($model, 'username')->textInput(['maxlength' => 20]) ?>

<?=$form->field($model, 'password')->passwordInput(['maxlength' => 20]) ?>

<?=$form->field($model, 'sex')->radioList(['1'=>'男','0'=>'女']) ?>

<?=$form->field($model, 'edu')->dropDownList(['1'=>'大学','2'=>'高中','3'=>'初中'], ['prompt'=>'请选择','style'=>'width:120px']) ?>

<?=$form->field($model, 'file')->fileInput() ?>

<?=$form->field($model, 'hobby')->checkboxList(['0'=>'篮球','1'=>'足球','2'=>'羽毛球','3'=>'乒乓球']) ?>

<?=$form->field($model, 'info')->textarea(['rows'=>3]) ?>

<?=$form->field($model, 'userid')->hiddenInput(['value'=>3]) ?>

<?=Html::submitButton('提交', ['class'=>'btn btn-primary','name' =>'submit-button']) ?>
   
<?=Html::resetButton('重置', ['class'=>'btn btn-primary','name' =>'submit-button']) ?>

<?php ActiveForm::end(); ?>

提示: 如果你正在你的应用程序中使用 Twitter Bootstrap CSS 你可以使用yii\bootstrap\ActiveForm 来代替 yii\widgets\ActiveForm。 前者继承自后者并在生成表单字段时使用 Bootstrap 特有的样式。

1.12、yii2 中添加全局函数

①、方法一

这种方法就是直接在入口文件 index.php 里面写函数,示例代码如下:

// 全局函数
function pr($var)
{
    $template = php_sapi_name() !== 'cli' ? '<pre>%s</pre>' : "\n%s\n";
    printf($template, print_r($var, true));
    exit;
}
(new yii\web\Application($config))->run();

这个方法虽然可以实现,但是本人不推荐,因为改了框架本身的代码,而且如果全局函数多了的话,也不好管理。

②、方法二(推荐)

这种方法主要是利用 composer 来实现,在 composer.json 文件里面添加如下代码:

"autoload": {
    "files": [
      "common/components/GlobalFunctions.php"
    ]
},

添加完之后记得用终端在项目根目录下执行 composer update 命令。

然后我们的全局函数都可以写在 GlobalFunctions.php 文件里面,这个方法实现的话 IED 是会用代码提示的。

1.13、yii2 中常用路径

Yii::$app->request->hostInfo; //url 中的 host 信息

Yii::$app->request->pathInfo; //url 中的路径信息(不包含 host 和参数)

Yii::$app->request->url; //不包含 host 信息的 url(含参数)

Yii::$app->request->absoluteUrl; //完整 url(含 host 以及参数)

Yii::$app->request->referrer; //上一个 url

Yii::$app->request->userIP; //当前用户ip

Yii::$app->controller->id; //当前控制器名称

Yii::$app->controller->action->id; //当前操作名称

1.14、Yii2.0-权威指南

文件

二、yii2 中 pjax 的使用

2.1、什么是 Pjax

当你点击一个站内的链接的时候,不是做页面跳转,而是只是站内页面刷新。

而且 ajax 刷新是支持浏 器历史的,刷新页面的同时,浏览器地址栏位上面的地址也是会更改,用浏览器的回退功能也能够回退到上一个页面。

2.2、Pjax 在 yii2 中的应用

①、刷新时间

<?php
$script = <<< JS
$(document).ready(function() {
    setInterval(function(){ $("#refreshButton").click(); }, 1000);//每隔1秒自动刷新
});
JS;
$this->registerJs($script);
?>

②、后台 GridView 显 示数据排序

或者直接配置,前提是下载 kartik-v/yii2-grid

"pjax"=>true

三、yii2 ACF

3.1、什么是 ACF

Access control filter —— 存取控制过滤器,是一种通过 yii\filters\AccessControl 类来实现的简单授权方法, 非常适用于仅需要简单的存取控制的应用。

3.2、yii2 中的 ACF

public function behaviors()
{
    return [
        "access" => [
            "class" => AccessControl::className(),
            //only 选项指明 ACF 应当只 对 login, logout 和 signup 方法起作用
            "only" => ["login", "logout", "signup"],
            "rules" => [
                [
                    "allow" => true,
                    "actions" => ["login", "signup"],
                    "roles" => ["?"],
                ],
                // 允许认证用户
                [
                    "allow" => true,
                    "actions" => ["logout"],
                    //@ 是一个特殊标识, 代表"已认证用户"。
                    //? 是另一个特殊的标识,代表"访客用户"
                    "roles" => ["@"],
                ],
            ],
        ],
        //指定该规则用于匹配哪种请求方法(例如GET,POST)。 这里的匹配大小写不敏感
        "verbs" => [
            "class" => VerbFilter::className(),
            "actions" => [
                "logout" => ["post"],
            ],
        ],
    ];
}

3.3、自定义过滤器

①、ACF 如何工作

ACF 自顶向下逐一检查存取规则,直到找到一个与当前 欲执行的操作相符的规则。

然后该匹配规则中的 allow 选项的值用于判定该用户是否获得授权。如果没有找到匹配的规则, 意味着该用户没有获得授权

②、ACF 处理未授权操作

当 ACF 判定一个用户没有获得执行当前操作的授权时,它的默认处理是:

如果该用户是访客,将调用 yii\web\User::loginRequired() 将用户的浏览器重定向到登录页面。

如果该用户是已认证用户,将抛出一个 yii\web\ForbiddenHttpException 异常。

你可以通过配置 yii\filters\AccessControl::denyCallback 属性定制该行为。

③、自定义过滤器

四、yii2 的 cookie 和 session 用法

4.1、Cookie

①、添加 Cookie

//第一种方法
$cookie = new \yii\web\Cookie();
$cookie -> name = "lulubin";        //cookie的名称
$cookie -> expire = time() + 3600;       //存活的时间
$cookie -> httpOnly = true;           //无法通过 js 读取 cookie
$cookie -> value = "cookieValue";       //cookie的值
\Yii::$app->response->cookies->add($cookie);
//第二种方法
$cookie = new \yii\web\Cookie([
    "name" => "lulubin",
    "expire" => time() + 3600,
    "httpOnly " => true,
    "value" => "cookieValue"
]);
\Yii::$app->response->cookies->add($cookie);

②、读取 Cookie

$cookie = \Yii::$app->request->cookies;
//返回一个yii\web\Cookie对象
$cookie->get("lulubin");
//直接返回 Cookie 的值
$cookie->getValue("lulubin"); //$cookie["lulubin"] 其实这样也是可以读取的
//判断一个Cookie是否存在
$cookie->has("lulubin");
//读取Cookie的总数
$cookie->count();

③、删除 Cookie

$cookie = Yii::$app->request->cookies->get("lulubin");
//移除一个 Cookie 对象
\Yii::$app->response->getCookies()->remove($cookie);
//移除所有 Cookie
\Yii::$app->response->getCookies()->removeAll();

注意:对Cookie进行增删改时调用的response , 对Cookie读取时使用的是Request

4.2、Session

①、添加 session

$session = \Yii::$app->session;
$session->set("lulubin_name" , "lulubin");
$session->set("lulubin_array" ,[1,2,3]);

②、读取 session

$session = \Yii::$app->session;
//读取一个Session
$session->get("lulubin_name);

③、删除 session

$session = \Yii::$app->session;

//删除一个session
$session->remove("lulubin_name");

//删除所有session
$session->removeAll();

五、yii2 RESTful web 服务

5.1、什么是 RESTful

RESTful API 设计指南理解RESTful架构

5.2、yii2 中的使用方法

常用的都在这里资料参考地址

默认有5个方法:index、view、create、update、delete、options;

实际开发中某些人看到这样的输出界面不爽,没关系;作者已经考虑到了:用法和 index 一样

parent::actions()['view']['findModel'] = [$this, 'methodNameInController']

或者也可以:

public function actions()
{  
    $actions = parent::actions();  
    // 禁用""index,delete" 和 "create" 操作  
    unset($actions['index'],$actions['delete'], $actions['create']);
    return $actions;  
}  

public function actionView()
{
    //这里可以做你想做的
}
public function actions(){
    $actions= parent::actions();  
    $actions['view']['class'] = 'app\my_actions\viewAction'; 
    return $actions;  
}
这个也可以实现重写

六、yii2 延迟加载机制

6.1、类的延迟加载

①、一般情况:根据不同情况加载不同类的实现方法

②、Yii2 的延迟加载:类的延迟加载 spl_autoload_register() __autoload()

6.2、组件的延迟加载

组件的延迟加载:由应用主体延迟到控制器中去加载组件

七、yii2 隐藏 index.php

(Apache + nginx)

7.1、Yii 文件配置

在配置文件 main.php 中添加

'urlManager' => [
    //用于URL路径化
    'enablePrettyUrl' => true,
    //指定是否在URL在保留入口脚本 index.php
    'showScriptName' => false,
],

7.2、服务器配置

①、Apache 配置

同时还要在index.php同级目录下新建.htaccess文件

#表示开启重写引擎
RewriteEngine on
#请求的文件或路径是不存在的,如果文件或路径存在将返回已经存在的文件或路径
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php

.htaccess文件解释

概述来说,htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。 
通过htaccess文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。

②、nginx 配置

A nginx.conf 配置

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    fastcgi_connect_timeout 300;
    fastcgi_send_timeout 300;
    fastcgi_read_timeout 300;
    fastcgi_buffer_size 128k;
    fastcgi_buffers 4 128k;
    fastcgi_busy_buffers_size 256k;
    fastcgi_temp_file_write_size 256k;
    gzip on;
    gzip_min_length  1k;
    gzip_buffers     4 32k;
    gzip_http_version 1.1;
    gzip_comp_level 2;
    gzip_types       text/plain application/x-javascript text/css application/xml;
    gzip_vary on;
    gzip_disable "MSIE [1-6].";
    server_names_hash_bucket_size 128;
    client_max_body_size     100m; 
    client_header_buffer_size 256k;
    large_client_header_buffers 4 256k;
    server {
        listen       80;
        server_name  localhost;
        #你的项目根目录
        root   "D:/Program Files/phpStudy/WWW";
        location / {
            index  index.html index.htm index.php l.php;
           autoindex  off;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
        location ~ \.php(.*)$  {
            #你的项目根目录
            root   "D:/Program Files/phpStudy/WWW";
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_split_path_info  ^((?U).+\.php)(/?.+)$;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            fastcgi_param  PATH_INFO  $fastcgi_path_info;
            fastcgi_param  PATH_TRANSLATED  $document_root$fastcgi_path_info;
            include        fastcgi_params;
        }
    }
    include vhosts.conf;
}

B vhosts.conf 配置

server {
        listen       80;
        #你的虚拟主机名
        server_name  www.luluqi.com ;
        #虚拟主机根目录
        root   "D:/Program Files/phpStudy/WWW/luluyii/web";
        location / {
            index  index.php index.html index.htm;
            #nginx ignore index.php
            if (!-e $request_filename){  
              rewrite ^/(.*) /index.php last;  
            }    
        }
        location ~ \.php(.*)$ {
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_split_path_info  ^((?U).+\.php)(/?.+)$;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            fastcgi_param  PATH_INFO  $fastcgi_path_info;
            fastcgi_param  PATH_TRANSLATED  $document_root$fastcgi_path_info;
            include        fastcgi_params;
        }
        
}

八、yii2 中后台添加《系统管理员操作日志》的功能

出于监控多用户操作后台的目的,往往需要把各个管理员操作了什么记录下来。

这个功能用 yii2 来实现简直是太简单了!下边上代码~

1、在 backend 目录创建 components/AdminLog.php

<?php
namespace backend\components;

use Yii;
use yii\helpers\Url;

class AdminLog
{
    public static function write($event)
    {
        // 具体要记录什么东西,自己来优化$description
        if(!empty($event->changedAttributes)) {
            $desc = '';
            foreach($event->changedAttributes as $name => $value) {
                $desc .= $name . ' : ' . $value . '=>' . $event->sender->getAttribute($name) . ',';
            }
            $desc = substr($desc, 0, -1);
            $description = Yii::$app->user->identity->username . '修改了' . $event->sender->className() . 'id:' . $event->sender->primaryKey()[0] . '的' . $desc;
            $route = Url::to();
            $userId = Yii::$app->user->id;
            $model = new \common\models\AdminLog();
            $data = [
                'route' => $route,
                'description' => $description,
                'user_id' => $userId,
                'created_at' => time(),
            ];
            $model->setAttributes($data);
            $model->save();
        }
    }
}

2、在 backend/config/main.php 添加

'on beforeRequest' => function($event) {
    \yii\base\Event::on(
        \yii\db\BaseActiveRecord::className(), 
        \yii\db\BaseActiveRecord::EVENT_AFTER_UPDATE, 
        ['backend\components\AdminLog', 'write']
    );
},

3、mysql 中创建 admin_log 表

CREATE TABLE `admin_log` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `route` varchar(255) NOT NULL DEFAULT '',
  `description` text,
  `created_at` int(10) NOT NULL,
  `user_id` int(10) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

4、用 gii 生成 AdminLog 模型:命名空间为 common\models

九、yii2 页面提示消息

9.1、适用情况

比如提交一个表单,提交完成之后在页面展示一条提示消息。

9.2、实现方法

①、控制器

单条消息:

\Yii::$app->getSession()->setFlash('error', 'This is the message');
\Yii::$app->getSession()->setFlash('success', 'This is the message');
\Yii::$app->getSession()->setFlash('info', 'This is the message');多条消息:

多条消息:

\Yii::$app->getSession()->setFlash('error', ['Error 1', 'Error 2']);

②、视图

use yii\bootstrap\Alert;
if( Yii::$app->getSession()->hasFlash('success') ) {
    echo Alert::widget([
        'options' => [
            'class' => 'alert-success', //这里是提示框的class
        ],
        'body' => Yii::$app->getSession()->getFlash('success'), //消息体
    ]);
}
if( Yii::$app->getSession()->hasFlash('error') ) {
    echo Alert::widget([
        'options' => [
            'class' => 'alert-error',
        ],
        'body' => Yii::$app->getSession()->getFlash('error'),
    ]);
}

如果有消息就会显示对应消息,表现是一个div,和 bootstrap 的警告框是一样的。

你想把消息提示放在哪里,把上述代码就放到那里就可以了。

十、yii2 依赖注入

10.1、依赖注入:解决类与类耦合

10.2、依赖注入之容器

10.3、依赖注入之服务定位器

十一、yii2 view 中使用 controller 定义的变量

11.1、从 controller 传递值到 view 中

11.2、在 controller 设置 view::params 属性的值

在 view 中访问

11.3、view::context 获取上下文

十二、yii2 事件机制

12.1、什么是事件机制

主逻辑抛出事件,次逻辑响应事件

扫描式:为对象1配置数组/数据表,抛出event对象;对象2时刻扫描对象1抛出的event对象。

绑定式:对象2绑定event事件,对象1触发event事件

12.2、对象级别的事件绑定 Event::on()

12.3、类级别的事件绑定

十三、yii2 视图

13.1、视图之数据安全

Html::encode() HtmlPurifier::process()

13.2、视图之数据块

View->beginBlock/endBlock

十四、yii2 场景的简单使用

14.1、问题的提出

举个简单的例子:

现在在 post表里面有 title image content 三个的字段,当我创建一个 post 的时候,我想三个字段全部是必填项,但是你修改的时候,title content 两个字段是必填的, iamge 可以不填写。

正常的情况下,[['title', 'content', 'image'], 'required',],但是我们更改的时候 只需要 [['title', 'content'], 'required'] 就可以了,但是少了 image 字段 我们的表单就无法提交,这种问题怎么办啊??

场景可以帮你解决这种问题,下面是一个简单的场景实例。

14.2、场景实例

①、首先我们在 model 里面定义一下场景 类名必须是 scenarios()

public function scenarios()
{
    return [
        'create' => ['title', 'image', 'content'],
        'update' => ['title', 'content'],
    ];
}

②、下面设置 rules() ,调用场景我们用 on 关键字

[['title', 'content'], 'required', 'on' => ['create', 'update']],
[['image'], 'required', 'on' => 'create'],
[['image'],'image','enableClientValidation'=>true,'maxSize'=>1024,'message'=>'您上传的文件过大','on'=>['create']],

on 指定的就是场景,一个场景用字符串,多个场景用数组

③、Controller 里面

$model = $this->findModel($id);
$model->setScenario('update'); or $model->scenario = 'update';

上面的意思就是 调用 update 场景。一切就是这么简单。

十五、yii2 $layout 的详细讲解

15.1、$layout 存在位置和 $layout 的查找顺序

①、存在位置

Controller和Module里面定义了布局变量$layout。

②、查找顺序

A 先查看当前Controller里面有没有定义布局变量

B 如果为Null,查找所在Module定义的布局变量

C 查找父级Module定义的布局变量

15.2、$lauout 变量值

①、false,不使用布局文件

②、null,使用Module中定义的布局文件

③、字符串,指定布局文件:在yii\base\Controller中findLayoutFile( )定义匹配规则

A、别名开头,指定布局文件路径

B、/开头,指定app下面的布局文件:$this->layout=’/main’

C、使用当前Module里面的布局文件

15.3、嵌套的布局文件

View::beginContent

布局文件 mylayout 所使用的布局文件是 main

十六、yii2 自定义 gii 模板

16.1、背景

yii2 中 gii 给我们实际的使用提供了很大的方便。

但是,实际开发中,相信 gii 生成的模板也给很多开发者带来了不变,为啥?

因为都是都是用人家的模板主动性生成的,自然不满足千万家的需求了,自家的需求还是自家定制的好,毕竟官方也只是尽可能的给出一个模板案例。

16.2、关于 gii 的使用

官方文档说明

16.3、自定义 gii

gii生成器所用到的模板文件位于目录 vendor\yiisoft\yii2-gii\generators\crud\default。

因为要自定义模板,我们现在把 default 目录拷贝一份,粘贴到任意目录,这里我们粘贴在根目录下的 giitemplate\curd 下面,然后按照下面进行配置

$config['modules']['gii'] = [ 
'class' => 'yii\gii\Module', 
'allowedIPs' => ['127.0.0.1', '::1'],
'generators' => [ 
    'crud' => [ //生成器名称 
        'class' => 'yii\gii\generators\crud\Generator', 
        'templates' => [ //设置我们自己的模板 
            //模板名 => 模板路径 
            'myCrud' => '@app/giitemplate/crud/default', 
        ] 
    ] 
], 
];

然后我们打开 gii-curd,在 curd generator 内最后一项 code template 中,我们就可以看到自定义的模板了。

十七、yii2 之 Mixin

17.1、Mixin 技术

类和对象的混合,注入新的属性方法

类的混合:多重继承的意思

对象的混合:往实例化的对象中添加需要的属性方法

17.2、Yii 框架提供

行为实现 mixin

①、Yii2 行为之类混合

②、yii2 行为之对象混合

暂时还没有评论,快来抢沙发吧~

发表评论

您需要登录后才可以评论。登录 | 立即注册
阅读 1514