在控制器基类里加入如下代码即可实现

    public function behaviors()
{
    return ArrayHelper::merge([
        [
            'class' => Cors::className(),
            'cors'  => [
                'Origin'                           => ['*'],
                'Access-Control-Request-Method'    => ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS'],
                'Access-Control-Request-Headers'   => ['*'],
                'Access-Control-Allow-Origin'      => ['*'],
                'Access-Control-Allow-Credentials' => true,
                'Access-Control-Max-Age'           => 86400,
                'Access-Control-Expose-Headers'    => [],
            ],
        ],
    ], parent::behaviors());
}

什么是字段映射呢,就是我们不太希望在前台的表单中暴露数据库的真实字段,比如用户名数据库是username,但是前台表单中不想显示这个名字,用user代替。很遗憾的是YII不支持这种操作。我只好借鉴ThinkPHP,写了一个方法实现。具体看以下代码:

    public $_map = [];

/**
 * 处理字段映射
 * @access public
 * @param array $data 当前数据
 * @return array
 */
public function parseFieldsMap($data)
{
    // 检查字段映射
    if (!empty($this->_map)) {
        foreach ($this->_map as $key => $val) {

            if (isset($data[$key])) {
                $data[$val] = $data[$key];
                unset($data[$key]);
            }

        }
    }
    $this->attributes = $data;
}

可以把以上代码写到model的基类里,其他业务model继承。使用方法就是在map数组,写上对应替换的字段,然后在save之前调用上面方法替换。

很多文章介绍场景验证,但是例子都不好使,很多博主发文章,没测试过就发上来对人误导很大。场景主要用于不同场景下的验证规则,比如场景一验证ABC三个字段,场景二只需要验证AB两个,这时候场景验证就发挥作用了。废话不多说,直接上代码。
1.要在model类加入以下代码

public function scenarios()
{
    $scenarios = parent::scenarios();
    $scenarios['create'] = ['id','major_name', 'remark','is_show', 'status', 'created_at', 'updated_at'];
    $scenarios['update'] = ['id', 'remark','is_show', 'status',  'updated_at'];
    return $scenarios;
}

注意function名字不能修改,并且 $scenarios = parent::scenarios();这句话不能少,很多文章都没写这个,导致验证不生效。
2.在rules里加上对应场景,如下代码代表只有在新增时触发验证唯一操作

public function rules()
{
    return [
        ['major_name','checkUnique','on'=>'create'],
    ];
}

3.在代码里设置场景

$model = new User();
$model->setScenario('create');

好了,至此就大功告成。

simple-uploader.js(也称 Uploader) 是一个上传库,支持多并发上传,文件夹、拖拽、可暂停继续、秒传、分块上传、出错自动重传、手工重传、进度、剩余时间、上传速度等特性;该上传库依赖 HTML5 File API。
具体介绍详见simple-uploader.js详细介绍
前端代码,我这里就不赘述了,文档里比较详细了,也有官方的demo,可以参考小小的demo



- 阅读剩余部分 -

Swagger™的目标是为REST APIs 定义一个标准的,与语言无关的接口,使人和计算机在看不到源码或者看不到文档或者不能通过网络流量检测的情况下能发现和理解各种服务的功能。当服务通过Swagger定义,消费者就能与远程的服务互动通过少量的实现逻辑。类似于低级编程接口,Swagger去掉了调用服务时的很多猜测。
上面的话有点干,可能看不懂,简单来说就是用来测试API接口,有点类似postman。看下面这幅图就一目了然了。


- 阅读剩余部分 -