Yiiチームは、PHPフレームワークの新しいバージョンであるYii 2.0.14を紹介します。 セキュリティの修正を含む、 100以上の改善と修正が含まれています。
このリリースには、既存のアプリケーションに影響を与える可能性のあるいくつかの変更が含まれています。 これらの変更については、UPGRADE.mdで説明されています。
このアップデートのリリースを支援してくれたYiiコミュニティに感謝します!
GitHubにアスタリスクを付けることにより、開発プロセスを追跡できます。 助けを求めたり、経験を共有したりできるYiiコミュニティがたくさんあります。私たちと他の何千人ものYiiユーザーが喜んであなたに会います。
このリリースは、 改善を含むバージョンYii 2.0の最新リリースになりつつあるという点で重要です。 これは、バージョン2.1.xの開発に専念することを意味します。これには、後方互換性の維持に関する制限のために2.0.xブランチに含めることができない多くの新しい改善が含まれます。 それにもかかわらず、2.0.xブランチには修正とセキュリティの改善が加えられます。 サポート2.0.xの締め切りは、バージョン2.1のリリースとともに発表されます。
composer.json
のフレームワークのバージョンのスペルが正しいこと( ~2.0.14
)を確認し、リリース時に誤って2.1にアップグレードしないようにしてください。
以下では、リリースの最も興味深い改善と修正について検討します。 完全なリストは、いつものようにCHANGELOGにあります。
スケーラビリティと同時実行性
スケーラビリティと同時実行性の問題は、開発の初期段階でバックグラウンドに消えることがよくありますが、ビジネスの成長とともに「ポップアップ」します。 このリリースでは、データベースへの値の書き込みとセッションIDの更新に関連するバグを見つけて修正しました。 マスタースレーブレプリケーションを使用する場合、 yii\web\DbSession
、 yii\validators\UniqueValidator
およびyii\validators\ExistValidator
はスレーブサーバーにアクセスできますが、マスターサーバーにアクセスする方が適切です。
バリデーターの改善
上記に加えて、バリデーターの改善がいくつかあります。
まず、 ExistValidator
は、 targetRelation
プロパティがtargetRelation
いる場合、関係の存在を確認できるようになりtargetRelation
。 これは、検証ルールの次の構成を記述できることを意味します。
public function rules() { return [ [['customer_id'], 'exists', 'targetRelation' => 'customer'], ]; } public function getCustomer() { return $this->hasOne(Customer::class, ['id' => 'customer_id']); }
次に、 FileValidator
は、ユーザーがダウンロードする必要があるファイルの最小数minFiles
示す新しいプロパティFileValidator
受け取りました。
行動
yii\behaviors\BlameableBehavior
は、ユーザーIDを特定できない場合に使用される新しいdefaultValue
プロパティを取得しました。 これは通常、コンソールアプリケーションでActiveRecordモデルが使用されている場合に発生します。
新しいtypecastAfterSave
プロパティがyii\behaviors\AttributeTypecastBehavior
登場しました。 true
に設定されているtrue
、属性値はモデルを保存した直後に指定されたタイプに変換されます。 タイプは、データベースからモデルをロードするときと同じです。
動作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', ], ], ]; }
データベースとActiveRecord
このリリースでは、データベースとActiveRecordに関連する多くの新しいものが追加されています。 これらの改善は、 Dmitry Naumenko 、 Sergey Makinen 、 Robert Korulchyk 、 Nikolai Oleinikovおよびその他のコミュニティメンバーによって実装されました。
条件記述オブジェクトの形式とユーザーデータ型
カスタムデータ型のサポートが実装されました。 MySQLおよびPostgreSQLのJSONサポート、およびPostgreSQLの 配列が追加されました。 これを実現するために、クエリビルダーの内部実装が大幅に再設計され、オブジェクト形式で条件を記述するためのサポートを実装することも可能になりました 。 条件を記述するための使い慣れた形式のサポートは変更されていません。 さらに、形式を組み合わせることができます。
$query->andWhere(new OrCondition([ new InCondition('type', 'in', $types), ['like', 'name', '%good%'], 'disabled=false', ]));
この改善にはいくつかの利点があります。 まず、Yii開発チームが条件に関連するコードを簡単に保守できるようになりました。 これにより、 15 BETWEEN min_age AND max_age
ようなSQLを収集する新しいBetweenColumnsCondition
条件の追加が既に許可されています。 ほとんどの場合、新しいタイプの条件のサポートがリリース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])
アップサート
データベース層のもう1つの重要な改善点は、 UPSERT
のサポートでしたUPSERT
は、新しいレコードが存在しない場合(一意のキーがチェックされる場合)を作成するか、既存のレコードを変更するアトミック操作です。 たとえば、次のコードを見てください。
Yii::$app->db->createCommand()->upsert('pages', [ 'name' => 'Front page', 'url' => 'http://example.com/', // URL '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');
新しいリクエストキャッシングAPI
以前は、クエリを Connection::cache()
ラップすることにより、クエリの結果をキャッシュできました。 より便利なAPIを使用できるようになりました。
// query (new Query())->cache(7200)->all(); // AR User::find()->cache(7200)->all();
アクティブレコード内のリンク
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
エラー処理
ロギングターゲットは、ログを正しくエクスポートできない場合に例外をスローするようになりました。 以前は、エラーを黙って無視していたため、ディレクトリへの不正な権限などが原因で、ログが存在しなかった可能性がありました。
また、HTTPヘッダーが既に送信されている場合yii\web\HeadersAlreadySentException
追加のyii\web\HeadersAlreadySentException
を送信しようとするyii\web\HeadersAlreadySentException
例外がスローされます。 以前は、この状況は黙って無視されていました。
$traceLine
プロパティを変更することで、Yiiエラーハンドラを設定できるように$traceLine
ました。 これは、たとえば、開発環境ですぐに開くことができるリンクを生成するために使用できます。 セットアップは、デバッグパネルのリンクのセットアップに似ています:
'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 ], ]; }
安全性
次の2つの脆弱性が発見され、修正されました。
- CVE-2018-6009
web/User.php
のswitchIdentity()
メソッドは、ユーザーの変更時にCSRFトークンを再作成しませんでした。 - CVE-2018-6010 場合によっては、エラーハンドラーによって処理された例外からデバッグ情報を取得することができました。
PHP 7.2
Yii 2.0.14はPHP 7.2を完全にサポートしています。 サポートされているすべてのバージョンのPHPでyii\filters\HttpCache
、 FileHelper::getExtensionsByMimeType()
およびyii\web\Session
が正しく機能するようにFileHelper::getExtensionsByMimeType()
。
ウィジェット、フォーム、クライアントJavaScript
<script>
にはtype
プロパティが含まれなくなりました。 それは短く見え、HTML5バリデーターを幸せにします:)
モデル属性のアクティブフォームおよびHtmlヘルパーによって生成されたフィールドでは、自動生成されたプレースホルダーを使用できます。
<?= Html::activeTextInput($post, 'title', ['placeholder' => true]) ?>
Bootstrap 4をサポートする方法で、検証エラーの存在に関するクラスマークを受け取る要素を指定する機能が追加されました。
<?php $form = ActiveForm::begin([ 'validationStateOn' => ActiveForm::VALIDATION_STATE_ON_INPUT, // VALIDATION_STATE_ON_CONTAINER ]) ?>
これで、PHPコードからJavaScript変数を安全に登録できます。
class SiteController extends Controller { public function actionIndex() { $this->view->registerJsVar('username', 'SilverFire'); return $this->render('index'); } }
この方法は、PHPからJSにデータを転送するために広く使用されているという事実にもかかわらず、最初にHTML5機能-data -attributesを使用することをお勧めします。
イベント
Pavel Klimovは、イベント処理用のマスクのサポートを追加したため、マスクの下にあるオブジェクトのイベントのグループにサブスクライブできるようになりました。
これは、ロギングと監査に非常に役立ちますドキュメントの新しいセクションには、この機能の詳細な説明と多くの使用例が含まれています。
API、シリアル化、フィルター
JsonResponseFormatter
構成するときに、コンテンツのタイプを指定できるように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
gte
の条件lt
、 gt
、 lte
、およびgte
をサポートするlte
なりgte
。
yii\base\ArrayableTrait::toArray()
は、 $fields
および$expand
プロパティでの再帰をサポートするようになりました。 REST APIs expand
をREST APIs expand
たREST APIs expand
へのリクエストはextra1.extra2
と記述できます。これは、元のデータセットにextra1
をデプロイし、次にextra2
にextra1
をデプロイする必要があることを意味します。 つまり、 http://localhost/comments?expand=post.author
ようなリクエストが可能になりました。
yii\filters\auth\HttpHeaderAuth
を使用して、認証ヘッダーのサポートを簡単に実装できるようになりました。
JSONで検証エラーをシリアル化する必要がある場合は、新しいメソッド\yii\helpers\Json::errorSummary()
を使用できます。
コンソール
コンソールアプリケーションの場合、モデル検証エラーをシリアル化する便利な方法も登場しました。
if (!$model->validate()) { echo "Model is not valid:\n"; echo \yii\helpers\Console::errorSummary($model); return ExitCode::DATAERR; }
bashおよびzshの自動補完スクリプトが改善されました。 ./yii help
自動補完を./yii help
。
コンソールコマンドを呼び出すことで、キャメルケースとケバブケースの両方でパラメーターを指定できます--selfUpdate
と--self-update
は同じパラメーターと見なされます。
さらに、 --<option>=<value>
に加えて、構文サポート--<option> <value>
。
ルーティング
グループルールでメソッドを説明するために、短い構文のサポートが追加されました。
'components' => [ 'urlManager' => [ // ... 'rules' => [ new GroupUrlRule([ 'prefix' => 'file', 'rules' => [ 'POST document' => 'document/create', ], ]), ], ],
国際化
yii\i18n\Locale
コンポーネントは、選択したロケールの通貨記号を返すgetCurrencySymbol()
メソッドで追加されました。
ヘルパー
このリリースでは、ヘルパーにいくつかの興味深い改善が加えられています。
2つの新しいyii\helpers\FileHelper
:
-
findDirectories()
-指定されたパスで見つかったディレクトリとサブディレクトリを返します。 このメソッドはfindFiles()
と同様にfindFiles()
しますが、ディレクトリを探します。 -
unlink()
-クロスプラットフォームのファイルまたはシンボリックリンクを削除します。 判明したように、機能もあります。
yii\helpers\StringHelper
matchWildcard()
メソッドがyii\helpers\StringHelper
に追加されました。これは、ネイティブのfnmatch()
メソッドと同じですが、オペレーティングシステムの仕様を考慮しています。 ネイティブ実装は、OSごとに異なる結果をもたらすことが確認されています。
yii\helpers\IpHelper
追加されました。 IPアドレスのバージョンを決定し、IPアドレスまたはサブネットをチェックして別のサブネットにエントリし、IPv6アドレスを完全な形式に展開する方法を提供します。 例:
if (!IpHelper::inRange($ip, '192.168.1.0/24')) { // deny access }
DIコンテナ
コンテナには、プロパティの説明を再利用する機能があります。
'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, ], ], ]
この例では、 TestService
クラスのmodel
プロパティの値は、説明TestModel
に構成されたTestModel
クラスのオブジェクトになります。
アプリケーションテンプレート
いくつかの小さな改善に加えて、基本テンプレートはDockerおよびVagrantからサポートを受けました。
リリース2.1の準備
2.0から2.1への移行を簡単にするために、Brandon Kellyは、ブランチ2.0.xで@deprecated
アノテーションを使用して、ブランチ2.1で既に削除されたメソッドとクラスを@deprecated
すること@deprecated
提案@deprecated
ました。 このマークを受け取った:
-
yii\base\BaseObject::className()
は、ネイティブ構文::class
を優先します。これにより、オートロードが発生しません(PHP> = 5.5でサポート)。 - XCacheおよびZendデータキャッシュサポートモジュール。
- メソッド
yii\BaseYii::powered()
; -
yii\base\InvalidParamException
では、yii\base\InvalidArgumentException
がyii\base\InvalidParamException
れます。 -
yii\BaseYii::trace()
、yii\BaseYii::debug()
ます。
これらのメソッドを使用するコードは引き続き機能しますが、IDEでは非推奨として強調表示されます。