Yii 2.0.14版本更新中文翻译

1,063 阅读5分钟

原文地址如下 www.yiiframework.com/news/165/yi… (英文版)

翻译中文内容如下,翻译参与人员 google翻译参与99% 阿北参与1%,鉴于水平有限,有的地方可能有点绕口,但是整体理解是没问题的。

我们非常高兴地宣布发布Yii Framework 2.0.14版。 请参阅http://www.yiiframework.com/download/上的说明安装或升级到此版本。

这是一个次版本,其中包含一百多个增强功能和bug修复,包括安全修复。这也是包含功能增强的最后一个2.0.x版本,接下来我们将专注于2.1分支的开发,2.0版本将只进行bug修复。在2.1版本发后时我们也将给出每个分支的时间表。

该版本有一些细微的变化可能影响你正在运行的yii2程序,所以在升级前务必仔细阅读 UPGRADE.md 文件。

感谢所有为这个框架贡献力量的Yii社区成员。 我们一起做了!

您可以通过starwatch yii2的GitHub项目来关注开发进度。还有许多活跃的yii社区,所以如果您需要帮助或想分享您的经验,请随时加入。

由于yii2.1正在开发中,因此请确保您的composer.json中有一个版本限制,这样它允许自动安装最新版本,直到下一个主要版本发布之前。不包含2.1的版本约束例如〜2.0.14,确保在composer.json中的版本约束中没有> =或*。

下面我们总结一下本版本中包含的一些最重要的功能/修复。

扩展性和并发性

虽然在项目早期阶段并不重要,但可扩展性和并发性问题是业务增长的主要障碍。

在本版本中,我们已经确定并修复了在yii\web\DbSession中写入和重新生成ID时出现的并发问题,也修复了在主从时使用yii\web\DbSession、yii\validators\UniqueValidator和yii\validators\ExistValidator出现的问题。

验证器增强

首先,ExistValidator现在可以在设置新的targetRelation属性时检查关系,这基本上意味着现在可以实现以下规则定义:

public function rules(){
    return [
        [['customer_id'], 'exists', 'targetRelation' => 'customer'],
    ];
}

public function getCustomer(){
    return $this->hasOne(Customer::class, ['id' => 'customer_id']);
}

北哥说:这是很方便的一个规则,进一步增强了关联方法的验证问题。

另一个增强功能是关于FileValidator,它有一个名为minFiles的新属性来指定用户必须上传的最小文件数量,比如下面的代码

['primaryImage', 'file', 'extensions' => ['png', 'jpg', 'gif'],'maxFiles'=>6,'minFiles'=>2]

行为

在行为方便变化也比较大,可能你对行为比较陌生,没关系,这个 专题 能帮助你。

首先yii\behaviors\BlameableBehavior新增了一个$defaultValue属性,用于当游客状态时对行为影响的属性设置默认值,这种情况在控制台的时候经常遇到。

yii\behaviors\AttributeTypecastBehavior增加属性typecastAfterSave,可以设置为true以保存模型保存后typecasted值。这使得属性类型在保存到数据库时进行转换时可以保持一致。

新增了yii\behaviors\CacheableWidgetBehavior,它可以根据指定的持续时间和依赖关系自动缓存小部件内容,如下代码

use yii\behaviors\CacheableWidgetBehavior;

public function behaviors(){
  return [
      [
          'class' => CacheableWidgetBehavior::className(),
          'cacheDuration' => 0,
          'cacheDependency' => [
              'class' => 'yii\caching\DbDependency',
              'sql' => 'SELECT MAX(updated_at) FROM posts',
          ],
      ],
  ];
}

北哥说:关于CacheableWidgetBehavior的具体方法我会在干货区发布一篇文章。

数据库和活动记录

此版本对这里有很多的功能增强,我们一个一个说。

自定义数据类型和对象条件

自定义数据类型支持已实施。 增加了对MySQL和PostgreSQL的JSON支持以及对PostgreSQL的数组支持。 为了做到这一点,查询生成器的内部结构被重构了很多,现在支持对象格式的条件:

$query->andWhere(new OrCondition([
    new InCondition('type', 'in', $types),
    ['like', 'name', '%good%'],
    'disabled=false',
]));

关于它有两件好事。 首先,为Yii团队提供支持现有条件和添加新条件更容易。 除了JSON和数组的条件外,它已经导致了一个新的BetweenColumnsCondition。 在Yii 2.1中可能会增加更多。 其次,现在添加自定义条件很方便。

查询生成器灵活性

查询生成器的灵活性得到全面改善 现在可以在yii\db\Expression支持的任何位置传递yii\db\Query。 例如,现在可以使用它,如下所示:

$subquery = (new Query)
    ->select([new Expression(1)])
    ->from('tree')
    ->where(['parent_id' => 1, 'id' => new Expression('tree.parent_id']));

(new Query())
    ->from('tree')
    ->where(['or', 'parent_id = 1', $subquery])

Upserts

另一件大事是Yii数据库层支持的所有数据库的upserts。 Upsert是一种原子操作,如果它们不存在(匹配唯一约束),则将行插入到数据库表中,或者在它们执行时更新它们:

Yii::$app->db->createCommand()->upsert('pages', [
    'name' => 'Front page',
    'url' => 'http://example.com/', // URL is unique
    'visits' => 0], ['visits' => new \yii\db\Expression('visits + 1')], $params)->execute();

将以原子方式插入新的页面记录或增加其访问计数器。

数据库迁移

生成器现在支持微型整数和JSON,因此您可以在迁移中使用以下内容:

$this->createTable('post', [
    'id' => $this->primaryKey(),
    'text' => $this->text(),
    'title' => $this->string()->notNull(),
    'attributes' => $this->json(),
    'status' => $this->tinyInteger(),
]);

有关迁移的另一个增强功能是创建和删除数据库视图的功能

$this->createView(
    'top_10_posts',
    (new \yii\db\Query())
        ->from('post')
        ->orderBy(['rating' => SORT_DESC])
        ->limit(10)
);

$this->dropView('top_10_posts');

新的查询缓存语法

这样用刚方便

// at query level
(new Query())->cache(7200)->all();

// at AR level
User::find()->cache(7200)->all();

AR关联

这个👍,Active Record现在会在相应的属性更新后重置相关模型:

$item = Item::findOne(1);
echo $item->category_id; // 1
echo $item->category->name; // weapons

$item->category_id = 2;
echo $item->category->name; // toys

错误处理

如果日志无法正确导出,日志目标现在会抛出异常。以前会忽略。

另一种情况是yii现在正在抛出yii\web\HeadersAlreadySentException异常,而不是如果之前已经发送了header(因此无法发送更多信息)则无法使用。

现在可以通过设置$ traceLine属性来配置Yii错误处理程序,以便在异常代码中生成链接,以便可以直接在IDE中打开这些链接。 配置与调试工具栏类似:

'components' => [
    // ...
    'errorHandler' => [
        'errorAction' => 'site/error',
        'traceLine' => '<a href="ide://open?url={file}&line={line}">{html}</a>',
    ],
],

使用yii\web\ErrorAction::$layout 属性,您可以方便地从错误操作配置中设置布局:

class SiteController extends Controller
{
    // ...
    /**
     * @inheritdoc
     */
    public function actions()
    {
        return [
            'error' => [
                'class' => 'yii\web\ErrorAction',
                'layout' => 'error', // <-- HERE
        ],
    ];
}

安全

在此版本中发现并修复了两个漏洞:

  • CVE-2018-6009 web/User.php中的switchIdentity()函数在更改身份后不会重新生成CSRF令牌。
  • CVE-2018-6010 远程攻击者可以从非调试模式下的错误处理程序打印的异常消息中获取潜在的敏感信息。

PHP7.2

此版本带来了完整的PHP7.2兼容性。 我们调整了yii\filters\HttpCache,FileHelper::getExtensionsByMimeType()和yii\web\Session,以便与我们支持的所有PHP版本一起使用。

小部件、表单和客户端

为 script 标记生成的标记不再具有类型属性。除了更好看,它使HTML5标记验证器感到高兴。

当我们用ActiveForm和Html类生成表单字段时,可以自动匹配和该字段属性相关的占位符。

<?=  Html::activeTextInput($post, 'title', ['placeholder' => true]) ?>

添加在ActiveForm中增加的一件事是能够选择哪个HTML元素接收验证状态类:

<?php $form = ActiveForm::begin([
    'validationStateOn' => ActiveForm::VALIDATION_STATE_ON_INPUT,
]) ?>

另一个好消息是现在可以通过PHP代码注册JavaScript变量了

class SiteController extends Controller
{
    public function actionIndex()
    {
        $this->view->registerJsVar('username', 'SilverFire');
        return $this->render('index');
    }
}

虽然它是广泛使用的将数据从PHP传递到JavaScript的方法,但在使用它之前,请考虑HTML5数据属性。

事件

Paul Klimov为事件添加了通配符匹配,现在可以订阅符合模式的多个对象或类事件。 这对记录和审计非常有用。 最新官方指南有这部分的样例。

API、序列化和过滤

配置JsonResponseFormatter时,您现在可以指定内容类型:

'components' => [
    'response' => [
        // ...
        'formatters' => [
            \yii\web\Response::FORMAT_JSON => [
                'class' => \yii\web\JsonResponseFormatter::className(),
                'contentType' => \yii\web\JsonResponseFormatter::CONTENT_TYPE_HAL_JSON,
            ],
        ],
    ],
]

数据过滤器现在可以在yii\validators\DateValidator上处理lt,gt,lte和gte。

yii\base\ArrayableTrait::toArray()现在允许递归$fileds字段和$expand。这意味着REST API查询扩展现在可以指定为extra1.extra2,并且可以在原始数据集中扩展extra1,然后在extra1数据集中扩展extra2,即http://localhost/comments?expand = post.author等查询是可能的。

如果您需要将模型验证错误转换为JSON,现在可以使用yii\helpers\Json::errorSummary()。

由于添加了yii\filters\auth\HttpHeaderAuth,自定义身份验证头现在更容易设置。

控制台

您希望有多少次内置方法将模型验证错误输出到控制台而不是执行foreach? 现在有一个:

if (!$model->validate()) {
    echo "Model is not valid:\n";
    echo \yii\helpers\Console::errorSummary($model);
    return ExitCode::DATAERR;
}

bash和zsh命令完成变得更好。 现在它理解./yii帮助。

当调用命令选项现在可以被指定为camelCase和kebab-case,即--selfUpdate和--self-update。 而且,除了 -option = value语法之外,现在可以使用 - option value语法。

路由

短动态语法现在可以在URL规则组中使用:

'components' => [
    'urlManager' => [
        // ...
        'rules' => [
            new GroupUrlRule([
                'prefix' => 'file',
                'rules' => [
                    'POST document' => 'document/create',
                ],
            ]),
    ],
],

i18n

新yii\i18n\Locale组件添加了getCurrencySymbol()方法,该方法可以获取给定语言环境的货币符号。

Helpers

此版本为Yii助手带来了非常有趣的增强功能。

yii\helpers\FileHelper有两个新的方法。

  • findDirectories()返回在指定目录和子目录下找到的目录。它与现有的findFiles()类似,但与目录一起工作。
  • unlink()以跨平台的方式删除文件或符号链接,这被证明是相当不好实现的。

yii\helpers\StringHelper得到了一个新的matchWildcard()方法,它与原生fnmatch()相同,但是在不同操作系统中一致。

yii\helpers\IpHelper已添加,它允许通过地址确定IP版本,将地址与掩码或范围进行比较,并扩展IPv6。 使用简单方便:

if(!IpHelper::inRange($ip, '192.168.1.0/24')) {
    // deny access
}

DI Container

依赖注入容器有能力将定义做为属性:

'container' => [
    'definitions' => [
        \console\models\TestService::class => [
            'class' => \console\models\TestService::class,
            'model' => Instance::of(\console\models\TestModel::class)
        ],
        \console\models\TestModel::class => [
            'class' => \console\models\TestModel::class,
            'property' => 20,
        ],
    ],
],

在上面的代码中,将使用依赖注入容器中配置的TestModel类的实例来设置TestService的model属性。

小结

作为功能增强的最后一个2.0版本,此次更新非常多,接下来阿北会针对v2.0.14中重点部分进行详细说明。