分类 Yii2.0相关 下的文章

yii2.0 多数据库操作

演示的版本是 basic 版,但是原理很好理解

编辑配置文件 @app/config/web.php

......
'db' => require(__DIR__ . '/db.php'), //框架提供的一个默认连接
'localDb' => require(__DIR__ . '/db2.php'), //这个是我们新加的一个连接配置
......

在同目录下的 db2.php 内容格式和 db.php 格式一样,只是连接不同

修改 model 中需要使用的 connection id

这时再在想改的 model 中复写 getDb() 方法

class Members extends \yii\db\ActiveRecord
{
    /**
     * @inheritdoc
     */
    public static function tableName()
    {
        return 'members';
    }

    /**
     * @return \yii\db\Connection the database connection used by this AR class.
     */
    public static function getDb()
    {
        return Yii::$app->get('localDb');
    }

    ......some functions.................
}

这个 model 中我们使用了 localDb 的链接配置,可以追踪代码 \yii\db\ActiveRecord中的 getDb() 方法,

//in \yii\db\ActiveRecord

/**
    * Returns the database connection used by this AR class.
    * By default, the "db" application component is used as the database connection.
    * You may override this method if you want to use a different database connection.
    * @return Connection the database connection used by this AR class.
    */
   public static function getDb()
   {
       return Yii::$app->getDb();
   }


有这么一段,既然已经显示出来 Yii::$app 这种核心的东西了,说明已经离那个connection容器已经不远了
再追踪到getDb() 显示的是 $this->get('db') 转换一下不就是默认使用的 Yii::$app->get('db') 吗? 于是回到最开始的 model 中,将其重写为 Yii::$app->get('localDb'),之后我们再使用这个 model 的时候就是使用的id 为localDb的 connection 单例了

beforeAction的一个示例

public function beforeAction($action)
{
    if(condition){
        Yii::$app->response->format = Response::FORMAT_JSON;
        Yii::$app->response->data = array(
            'status' => -1,
            'message' => '请先登录',
            'url' => \Yii::$app->getHomeUrl()
        );
        return false;
    }

    return true;
}

这个函数只返回bool值,响应内容交给 response

原文

局部关闭csrf验证

创建一个hehavior

<?php
use Yii;
use yii\base\ActionEvent;
use yii\base\Behavior;
use yii\web\Controller;


class NoCsrf extends Behavior
{
    public $actions = [];
    public $controller;
    public function events()
    {
        return [Controller::EVENT_BEFORE_ACTION => 'beforeAction'];
    }
    public function beforeAction($event)
    {
        $action = $event->action->id;
        if(in_array($action, $this->actions)){
            $this->controller->enableCsrfValidation = false;
        }
    }    
}

在controller中调用

<?php

    public function behaviors()
    {
        return [
            'csrf' => [
                'class' => NoCsrf::className(),
                'controller' => $this,
                'actions' => [
                    'action-name'
                ]
            ]
        ];
    }

这种方法是将控制器中指定的路由方法不经过csrf验证,如果是全局关闭csrf验证的话直接在 controller 添加

//关闭csrf验证
public $enableCsrfValidation = false;

原文地址