Yii 2.0.14

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 NaumenkoSergey MakinenRobert KorulchykNikolai 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つの脆弱性が発見され、修正されました。









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











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



ました。 このマークを受け取った:









これらのメソッドを使用するコードは引き続き機能しますが、IDEでは非推奨として強調表示されます。








All Articles