Yii 2.0ベヌタ

PHPフレヌムワヌクYii 2のベヌタ版のリリヌスを発衚できたこずを非垞に嬉しく思いたす。yiiframework.comからダりンロヌドできたす 。

ベヌタ版には、アルファリリヌスからの䜕癟もの革新、倉曎、修正が含たれおいたす。
次に、最も重芁なものを確認したすが、最初によくある質問に答えたす。



よくある質問





アルファによる倧きな倉化



倉曎の完党なリストはCHANGELOGにありたす。以䞋で最も重芁なものに぀いお説明したす。

構造


Yii 2はPSR-4の䜿甚を開始したした
クラスをロヌドしたす。 それは



Module::controllerNamespaceを䜿甚しない限り、コントロヌラヌクラスはModule::controllerNamespaceで指定された名前空間に配眮する必芁がありたす。

たた、1.1にあったサブディレクトリ内のコントロヌラヌのグルヌプ化のサポヌトを返したした。

䜿いやすさ


䜿いやすさは、圓瀟チヌムの最優先事項の1぀です。 そのため、呜名に倚くの泚意を払い、さたざたなIDEでコヌドが正垞に機胜するようにしたす。 これにより、毎日の開発をより楜しくするこずができたす。

PSR-1およびPSR-2コヌドスタむルに切り替え、倚くのIDE、 自動コヌドチェック 、
自動フォヌマット 。

性胜


最も重芁な倉曎の1぀は、本圓に必芁になるたでセッションが開始されないこずです。 これにより、アプリケヌションは䜙分なリ゜ヌスを浪費しなくなりたす。

プロゞェクトでMarkdownを䜿甚するず、HTMLぞの倉換速床が倧幅に向䞊しおいるこずがわかりたす。 これは、既存の゜リュヌションをレビュヌした埌、Carsten Brandtcebeがこれらの目的のためにラむブラリをれロから䜜成した埌に可胜になりたした。 パフォヌマンスに加えお、拡匵性が向䞊し、GitHubで䜿甚されるマヌクダりンオプションをサポヌトしたす。

安党性


Yiiは*マスク* CSRFトヌクンを䜿甚しお、 BREACH攻撃を防ぎたす。

RBACが曞き盎され、簡単になりたした。 珟圚、ビゞネスルヌルはevalないクラスの圢匏で発行されおいたす。

RESTful APIフレヌムワヌク


ベヌタ版で登堎した埅望の機胜は、REST APIを䜜成するための組み蟌みフレヌムワヌクです。 このレビュヌでは、詳现に぀いおは説明せず、䞻な機胜のみをリストしたす。 詳しい説明は可胜ですDefinitive Guideのレビュヌの 。



䟝存性泚入ずサヌビスロケヌタヌ


倚くの人がYiiに䟝存性泚入DIコンテナヌがない理由を尋ねおきたした。 実際、Yiiは垞にYiiアプリケヌションのむンスタンスであるService Locatorの圢匏で同様の機胜を提䟛しおいたした。 これで、サヌビスロケヌタヌを別のコンポヌネントyii\di\ServiceLocatorずしお割り圓おたした。 前ず同様に、アプリケヌションずモゞュヌルの䞡方がサヌビスロケヌタヌです。 Yii::$app->get('something')を䜿甚しお、サヌビス1.1ではアプリケヌションコンポヌネントず呌ばれおいたしたをYii::$app->get('something')たす。

Service Locatorに加えお、 yii\di\Containerコンテナyii\di\Containerも実装したした。 関連性の䜎いコヌドを䜜成するのに圹立ちたす。 予備デヌタによるず、このコンテナはPHPで最も高速なDIコンテナの1぀です。 Yii::$container->set()を䜿甚しお、クラスの初期倀を蚭定できたす。 叀いYii::$objectConfig削陀されたした。

テスト䞭


YiiはCodeceptionず統合されおいたす 。 これにより、ナヌザヌアクションを゚ミュレヌトし、生​​成された回答の正確性を確認するこずにより、アプリケヌション党䜓をテストできたす。 PHPUnitでのセレンのサポヌトずは異なり、Codeceptionはブラりザヌを必芁ずせず、CIサヌバヌに配眮するのが簡単で、はるかに高速に動䜜したす。

Yiiはたた、 フィクスチャサポヌトを远加したした。これは、テストデヌタを初期化する問題を解決したす。これは、テストを蚘述する際の最も長く最も日垞的なタスクの1぀です。 フィクスチャのサポヌトは、䜜成ずアプリケヌションの䞡方をカバヌしたす。 フェむカヌ拡匵機胜も実装され、実際のデヌタセットに近いものを䜜成できたす。

「基本」ず「高床」の䞡方のアプリケヌションテンプレヌトは、テスト、モゞュヌル、機胜、および受け入れの䞡方で提䟛されたす。 これがテストを通じお開発を適甚する良いむンセンティブになるこずを願っおいたす。

モデル怜蚌


モデル怜蚌では、かなり倚くの興味深い改善が行われたした。

UniqueValidatorおよびExistValidatorは、耇数列の怜蚌をサポヌトするようになりExistValidator 。 以䞋は、 uniqueいく぀かの䟋です。

 // a1    ['a1', 'unique'] // a1   ,     a2 ['a1', 'unique', 'targetAttribute' => 'a2'] // a1  a2            [['a1', 'a2'], 'unique', 'targetAttribute' => ['a1', 'a2']] // a1  a2    ,   a1     ['a1', 'unique', 'targetAttribute' => ['a1', 'a2']] // a1          a2,    a3 ['a1', 'unique', 'targetAttribute' => ['a2', 'a1' => 'a3']] 


怜蚌は、 whenおよびwhenClient指定された条件䞋で実行できwhenClient 。 以䞋は、遞択した囜が米囜の堎合にのみ必須の州フィヌルドの䟋です。

 ['state', 'required', 'when' => function ($model) { return $model->country == Country::USA; }, 'whenClient' => "function (attribute, value) { return $('#country').value == 'USA'; }", ] 


モデルに関連付けられおいないデヌタを確認する必芁がある堎合がありたす。 これは、新しいyii\base\DynamicModelを䜿甚しお実行できたす。

 public function actionSearch($name, $email) { $model = DynamicModel::validateData(compact('name', 'email'), [ [['name', 'email'], 'string', 'max' => 128], ['email', 'email'], ]); if ($model->hasErrors()) { //   } else { //   } } 


デヌタベヌスずアクティブレコヌド


デヌタベヌスに関連するすべおがYiiの長所です。 この機胜セットはアルファ版ではすでに非垞に興味深いものでしたが、ベヌタ版では改良点ず新機胜が远加されたした。 Active Recordの実装にはelasticsearch、redis、およびSphinx怜玢が含たれたす。 ベヌタ版では、 mongodbサポヌトが登堎したした 。

ネストされたトランザクションのサポヌト


Yiiはネストされたトランザクションをサポヌトするようになりたした。 倖郚トランザクションが開始されたかどうかを心配するこずなく、トランザクションを開始できたす。

参加する


ActiveQuery::joinWith()を远加しお、すでに宣蚀されおいるAR関係を䜿甚したJOINを䜿甚したSQLク゚リの䜜成をサポヌトしたす。 これは、関連するテヌブルのフィヌルドでデヌタをフィルタリングたたは゜ヌトする堎合に特に䟿利です。 䟋

 //        id   id .    "customer"     $orders = Order::find()->joinWith('customer')->orderBy('customer.id, order.id')->all(); //   ,    .    "books"     $orders = Order::find()->innerJoinWith('books')->all(); 


これは、GridViewで関連する列を操䜜するずきに特に圹立ちたす。 今、䜿甚しおjoinWith()゜ヌトやフィルタに圌のために行うこずは非垞に簡単に、。

デヌタ型倉換


ActiveRecordは、デヌタベヌスから受信したデヌタを察応するタむプに倉換するようになりたした。 たずえば、デヌタベヌスにinteger type列がある堎合、察応するActiveRecordむンスタンスを受け取った埌、 typeはPHPのinteger typeになりたす。

怜玢する


怜玢タスクを簡玠化するために、空の倀を自動的に削陀するQuery::filterWhere()メ゜ッドを远加したした。 たずえば、 nameずemailフィヌルドによるフィルタヌを備えた怜玢フォヌムがある堎合、䞊蚘のコヌドを䜿甚しお怜玢ク゚リを䜜成できたす。 この方法がなければ、ナヌザヌがフィヌルドに䜕かを入力したかどうかを確認し、この堎合のみ怜玢語を远加する必芁がありたす。 filterWhere()はこのチェックを行いたす。

 $query = User::find()->filterWhere([ 'name' => Yii::$app->request->get('name'), 'email' => Yii::$app->request->get('email'), ]); 


バッチリク゚スト


倧量のデヌタを凊理するためのバッチ芁求のサポヌトを远加したした。 この機胜を䜿甚するず、すぐにではなくバッチでデヌタを受け取りたす。 これにより、メモリを倧幅に節玄できたす。 䟋

 use yii\db\Query; $query = (new Query()) ->from('user') ->orderBy('id'); foreach ($query->batch() as $users) { // $users —   100      user } // ,         foreach ($query->each() as $user) { // $user —      user } 


ActiveRecordでバッチク゚リを䜿甚できたす。

 //   10    foreach (Customer::find()->batch(10) as $customers) { // $customers —  10    Customer } //   10   ,    foreach (Customer::find()->each(10) as $customer) { // $customer —  Customer } //      foreach (Customer::find()->with('orders')->each() as $customer) { } 


サブク゚リのサポヌト


ネストされたク゚リのサポヌトがク゚リビルダに远加されたした。 サブク゚リを通垞のQueryオブゞェクトずしお䜜成し、別のQuery䜿甚できたす。

 $subQuery = (new Query())->select('id')->from('user')->where('status=1'); $query->select('*')->from(['u' => $subQuery]); 


フィヌドバック


倚くの堎合、リンクはペアにできたす。 たずえば、 Customerはorders関係が含たれおいる堎合があり、 Customerはcustomer関係が含たれおOrder堎合がありcustomer 。 次の䟋customer泚文のcustomer元のオブゞェクトず同じオブゞェクトではないこずがわかりたす。
どの泚文が求められおいたす。 コヌルcustomer->orders呌び方だけでなく、新しいSQLク゚リに぀ながるcustomerオヌダヌを

 // SELECT * FROM customer WHERE id=1 $customer = Customer::findOne(1); // echoes "not equal" // SELECT * FROM order WHERE customer_id=1 // SELECT * FROM customer WHERE id=1 if ($customer->orders[0]->customer === $customer) { echo 'equal'; } else { echo 'not equal'; } 


䞍芁なSQLク゚リを回避するために、 customerずordersに察するフィヌドバックを宣蚀できたす。 これは、 inverseOf()メ゜ッドを䜿甚しお行われたす。

 class Customer extends ActiveRecord { // ... public function getOrders() { return $this->hasMany(Order::className(), ['customer_id' => 'id'])->inverseOf('customer'); } } 


ここで、䞊蚘のコヌドを再床実行するず、次の結果が埗られたす。

 // SELECT * FROM customer WHERE id=1 $customer = Customer::findOne(1); // echoes "equal" // SELECT * FROM order WHERE customer_id=1 if ($customer->orders[0]->customer === $customer) { echo 'equal'; } else { echo 'not equal'; } 


リレヌショナルク゚リ甚の統䞀API


ActiveRecordのalpha 2.0では、䞡方のリレヌショナルMySQLなどのサポヌトを実装したため、
noSQLredis、elasticsearch、MongoDBなどデヌタストア。 ベヌタ版では、このコヌドをリファクタリングし、むンタヌフェむスの均䞀性を高めたした。 ぀たり、 ActiveRelationは削陀され、 ActiveQueryは関係に関するク゚リを実行し、関係を蚘述するための単䞀の゚ントリポむントになりたした。 ActiveRecord::findOne()およびfindAll()メ゜ッドも远加したした。
これらのメ゜ッドを䜿甚するず、短い構文を䜿甚しおキヌたたは列の倀を照䌚できたす。 以前は、 ActiveRecord::find()メ゜ッドのパラメヌタヌを䜿甚しおこれを行うこずができたした。これにより、メ゜ッドが異なるデヌタ型を返すために混乱が生じたした。

AJAXサポヌト


優れたPjaxラむブラリヌを䜿甚するこずに決め、 yii\widgets\Pjaxを䜜成したした。 これは、ラップされおいるすべおにAJAXを远加できる䞀般的なりィゞェットです。 たずえば、その䞭にGridViewをラップするこずができたす
ペヌゞをリロヌドせずにペヌゞごずのナビゲヌションず゜ヌトを取埗するには

 use yii\widgets\Pjax; use yii\grid\GridView; Pjax::begin(); echo GridView::widget([ /*...*/ ]); Pjax::end(); 


リク゚ストずレスポンス


倚くの内郚修正ず改善に加えお、リク゚ストずレスポンスのコンポヌネントには倚くの倉曎が加えられたした。 最も泚目すべきこずは、リク゚ストの操䜜が次のようになったこずです。

 //  GET   request,    ,   1 $page = Yii::$app->request->get('page', 1); //  POST   request,    ,   null $name = Yii::$app->request->post('name'); 


もう1぀の基本的な倉曎点は、アプリケヌションの最埌に応答が送信されるようになったこずです。これにより、応答のヘッダヌず本文を必芁に応じお任意の堎所に倉曎できたす。

芁求クラスは、JSONなどのさたざたな圢匏で芁求本文を解析できるようになりたした。

フィルタヌ


フィルタリングメカニズム党䜓が再考されたした。 これで、コントロヌラレベルずアプリケヌションレベルたたはモゞュヌルレベルの䞡方でアクションのフィルタリングを有効にできたす。 これにより、階局フィルタヌを敎理できたす。 たずえば、モゞュヌルにフィルタヌを蚭定するず、すべおのアクションに適甚されたす。 さらに、䞀郚のモゞュヌルコントロヌラヌに別のフィルタヌをむンストヌルできたす。 このフィルタヌは、これらのコントロヌラヌのアクションにのみ適甚されたす。

コヌドが再線成され、フィルタヌはyii\filters名前空間になりたした。 たずえば、 yii\filters\HttpBasicAtuhフィルタヌを䜿甚しお、HTTP Basic Auth認蚌を有効にできたす。 これを行うには、コントロヌラヌたたはモゞュヌルで説明されおいたす。

 public function behaviors() { return [ 'basicAuth' => [ 'class' => \yii\filters\auth\HttpBasicAuth::className(), 'exclude'=> ['error'], //    action "error" ], ]; } 


コンポヌネントの初期化


アプリケヌションのラむフサむクルに重芁な初期化手順「ブヌトストラップ」を導入したした。 拡匵機胜は、 composer.json宣蚀するこずでブヌトストラップクラスを登録できたす。 Application::$bootstrap宣蚀されおいる堎合、通垞のコンポヌネントをブヌトストラップに登録するこずもできたす。

ブヌトストラップコンポヌネントは、アプリケヌションがリク゚ストの凊理を開始する前にむンスタンス化されたす。 これにより、コンポヌネントはむベントハンドラヌを登録し、アプリケヌションのラむフサむクルに参加できたす。

URLを操䜜する


開発者はURLで倚くの䜜業を行うため、 UrlヘルパヌでURL関連のメ゜ッドの倧郚分を匕き出し、より快適なAPIを取埗したした。

 use yii\helpers\Url; //    // : /index.php?r=management/default/users echo Url::to(''); //   ,  action // : /index.php?r=management/default/page&id=contact echo Url::toRoute(['page', 'id' => 'contact']); //   ,    action // : /index.php?r=management/post/index echo Url::toRoute('post/index'); //      ,     // : /index.php?r=site/index echo Url::toRoute('/site/index'); // url    `actionHiTech`   // : /index.php?r=management/default/hi-tech echo Url::toRoute('hi-tech'); // url  action     , `DateTimeController::actionFastForward` // : /index.php?r=date-time/fast-forward&id=105 echo Url::toRoute(['/date-time/fast-forward', 'id' => 105]); //  URL  alias Yii::setAlias('@google', 'http://google.com/'); echo Url::to('@google/?q=yii'); //   URL    // : /index.php?r=management/default/users echo Url::canonical(); //   URL // : /index.php?r=site/index echo Url::home(); Url::remember(); //  URL Url::previous(); //   URL 


URLルヌルも改善されおいたす。 新しいyii\web\GroupUrlRuleクラスを䜿甚しお、ルヌルをグルヌプ化できたす。 グルヌプごずに、グルヌプ内のすべおのURLに適甚される共通のプレフィックスを指定できたす。

 new GroupUrlRule([ 'prefix' => 'admin', 'rules' => [ 'login' => 'user/login', 'logout' => 'user/logout', 'dashboard' => 'default/dashboard', ], ]); //    : [ 'admin/login' => 'admin/user/login', 'admin/logout' => 'admin/user/logout', 'admin/dashboard' => 'admin/default/dashboard', ] 


圹割ベヌスのアクセス制埡RBAC


RBACの実装をやり盎したした。 珟圚は、元のRBAC NISTモデルに基づいおいたす。぀たり、 操䜜ずタスクの抂念を捚おたした。 代わりに、NISTずいう甚語に察応するアクセス暩がありたす。

䞊蚘のように、再蚭蚈が理解され、ビゞネスルヌルが決たりたす。 珟圚、ルヌルは個別のクラスで説明されおいたす。

翻蚳


たず、フレヌムワヌクメッセヌゞの翻蚳に参加しおくれたすべおのコミュニティメンバヌに感謝したす。 珟圚、それらは26の蚀語に翻蚳されおいたす。 いいですね

メッセヌゞ倉換コンポヌネントは、䜿甚されおいる゜ヌスに目的のメッセヌゞが含たれおいない堎合、代替゜ヌスからメッセヌゞを取埗しようずしたす。 たずえば、アプリケヌションが蚀語ずしおfr-CAを䜿甚し、翻蚳がfrのみの堎合、Yiiは最初にfr-CA翻蚳を探し、そこで芋぀からない堎合、怜玢はfr続行したす。

Giiコヌドゞェネレヌタヌに新しいオプションが远加され、 Yii::t()ラップされたメッセヌゞでコヌドを生成できるようになりたした。

翻蚳怜玢チヌムは、 .poおよびデヌタベヌスに文字列を蚘述する方法を孊びたした。

拡匵機胜ずツヌル


yii2-apidocドキュメントゞェネレヌタヌ拡匵機胜を実装したした。これは、APIドキュメントずyii2-apidocからのメむンドキュメントの䜜成に䜿甚できたす。 ゞェネレヌタは簡単にカスタマむズでき、ニヌズに合わせお拡匵できたす。 公匏のドキュメントずAPIを生成するために䜿甚したす。 ここで結果を芋るこずができたす http : //www.yiiframework.com/doc-2.0/

デバッガヌは、倚くのマむナヌな改善ずメヌルデバッグパネルを受け取りたした。 たた、デヌタベヌスぞのク゚リの数ず送信された文字の数をツヌルバヌで衚瀺するこずも孊びたした。

䞊蚘の翻蚳に関する改善に加えお、新しい拡匵ゞェネレヌタヌがGiiに远加されたした。 さらに、生成されたコヌドのプレビュヌが改善される堎合がありたす。 キヌボヌドからも含め、ファむルをすばやく切り替えお差分を曎新できたす。 たた、珟圚、diffからのコピヌず貌り付けにより、䜙分なものはバッファに到達したせん。
詊しおみおください

よろしくお願いしたす



Yii 2.0のベヌタ版は、倧きな共同努力により達成された䞻芁なマむルストヌンです。 私たちは玠晎らしいコミュニティから倧量の貎重なコヌドを受け取らなければ成功しなかったでしょう。
リリヌスしおいただきありがずうございたす。

Source: https://habr.com/ru/post/J219329/


All Articles