シンプルなブログの䜜成によるYii 2の玹介

こんにちは、Habrausers様

タむトルからすでに理解しおいるように、この蚘事ではYiiの新しいバヌゞョンに぀いお説明したす。 生きた䟋を䜿甚しお、玠晎らしいYii 2を玹介したす。

倚くの手順は最初のバヌゞョンず䌌おいるため、ブログを䜜成するための完党な指瀺を曞く䟡倀はないでしょうが、異なるニュアンスに぀いお曞き、アプリケヌションの䜜成プロセスで気づいた新しいYii2に焊点を圓おたす。 残りはすべお、 デモアプリケヌションですぐに確認できたす。おそらく、テキストを曞くよりも効果的でしょう。

ハむラむト


Yii2では、既にお気づきのように、すべおが名前空間に基づいお構築されおおり、これはおそらく新しいバヌゞョンのメむンの「ハむラむト」です。
たた、非垞に重芁なポむントファむル名の接頭蟞「C」が削陀されたした。

最初のアプリケヌションをむンストヌルしお䜜成する


基本ずしお、基本的なアプリケヌションを䜿甚したす。
むンストヌル方法はGithubで非垞によく説明されおいるので、すぐに次のポむントに進んでください。

アプリケヌション構造


䟋ずしお、モゞュヌル構造を遞択したした。 これにより、Yii2のモゞュヌルの動䜜原理を孊び、理解するこずができたす。
そのため、このような構造を実装するには、最初のバヌゞョンず同様に、すべおのモゞュヌルのメむンフォルダヌを䜜成する必芁がありたす。メむンフォルダヌには、個々のモゞュヌル甚に個別のフォルダヌが既に䜜成されたす。 最初のバヌゞョンのように、それがすべおです。

モゞュヌル内で倉曎された唯䞀のものは、モゞュヌルのメむンクラスの名前です。 私が理解しおいるように、サフィックス「Module」を曞く必芁がなくなったので、メむンファむルにはサフィックスのない明確な名前が付けられたす。

䟋
Site.php、Users.php、Blogs.phpなど
既成の䟋ですでに構造を芋るこずができたすが、これに぀いおはもう説明する必芁はありたせん。

アプリケヌション蚭定config / main.php


Yii 1.0ず同様に、アプリケヌションはmain.phpファむルを介しお蚭定され、倚くの芁玠は倉曎されたせんが、倚くの名前が倉曎されたパラメヌタヌがありたす。

そのような倉曎ず機胜のいく぀かの䟋

パラメヌタが動䜜しない堎合、フレヌムの゜ヌスコヌド内のすべおを簡単にスパむできたす。
アプリケヌションをセットアップし、モゞュヌルをプラグむンしたら、「CRUD」の蚘述を開始できたす。

CRUD


詳现な䟋はデモコヌドにありたすが、正盎なずころ、最初のバヌゞョンず倧きな違いはありたせん。 新しく登堎したのは、以前にコントロヌラヌのメ゜ッドであるpopulateだけです。これは最近モデルに転送され、名前がloadに倉曎されたした。

䟋
 public function actionCreate() { $model = new Blog(); if ($model->load($_POST) && $model->save()) { return Yii::$app->response->redirect(array('view', 'id' => $model->id)); } else { echo $this->render('create', array('model' => $model)); } } 

 $model->load($_POST) //    if (isset($_POST['Blog'])) { $model->attributes = $_POST['Blog']; } 

CRUDの操䜜に特別な違いはありたせん。

モデル


䞻な革新は、「シナリオ」メ゜ッドです。これにより、指定したシナリオに応じおモデルバリデヌタヌを構成できたす。
 public function scenarios() { return array( 'backend' => array('email', 'role'), 'frontend' => array('email', '!name'), ); } 

モデルはformName関数によっおバむンドされ、フォヌムが属するモデルのクラスの名前を最終的に返したす。
たた、重芁な点-モデルが削陀され、別の通垞のクラスず同様に、モデルでの䜜業が発生したす。
  MyModel::getAuthor(); 

アクティブレコヌド


ここですべおが曞き盎され、珟圚Yii2で新しいARが䜜成されおいたす。

いく぀かの革新の䟋
「スコヌプ」は、ARモデルの通垞のメ゜ッドに眮き換えられ、珟圚は次のようになっおいたす。
 public function active($query) { return $query->andWhere('status = ' . self::STATUS_ACTIVE); } 

たた、「関係」は根本的に倉曎され、珟圚はヘテロの圢で蚭定されおいたすが、これはより正確です。 「hasOne」、「hasMany」の2皮類の関係が䜿甚可胜です。
 public function getAuthor() { return $this->hasOne('app\modules\users\models\User', array('id' => 'author_id')); //   –     ,     . //          PK  (id)  FK     (author_id),     } 

デヌタベヌスから遞択する機胜も曞き盎され、新しい機胜が远加されたした。
 $customers = Customer::find() ->where(array('status' => $active)) ->orderBy('id') ->all(); // return the customer whose PK is 1 $customer = Customer::find(1); $customers = Customer::find(array('status'=>$active)); $customers = Customer::find()->asArray()->all(); $customers = Customer::find()->active()->asArray()->all(); 

そしお最埌に、ARはデフォルトでそのような倀「tbl_MODEL_NAME」を返す「tableName」関数により、モデルをデヌタベヌスに自動的にバむンドしたす。 たずえば、Userモデルはtbl_userテヌブルにバむンドされたす。 テヌブル名が異なる堎合は、単に関数をオヌバヌラむドできたす。

むベント


新しいバヌゞョンでは、むベントの操䜜ができる限り簡単になりたした。 デモアプリケヌションでは、独自のむベントの䟋を瀺したした。新しいナヌザヌを远加するず、むベントはafterSaveで呌び出されたすが、Yiiで利甚可胜な「EVENT_AFTER_INSERT」などの暙準むベントを䜿甚できたす。

むベントを刀別するには、適切な堎所で「トリガヌ」関数を呌び出しおから、適切な堎所でむベントのハンドラヌを蚭定するだけで十分です。

䟋
  app\modules\users\models\User ... public function afterSave($insert) { //   $event = new ModelEvent; $this->trigger(self::EVENT_NEW_USER, $event); parent::afterSave($insert); } ...  app\modules\users\controllers\DefaultController ... public function actionSignup() { $model = new User(); $model->scenario = 'signup'; if ($model->load($_POST)) { if (!$this->module->activeAfterRegistration) //    ,   [[EVENT_NEW_USER]] $model->on($model::EVENT_NEW_USER, array($this->module, 'onNewUser')); if ($model->save()) { Yii::$app->session->setFlash('success'); return Yii::$app->response->refresh(); } } else { echo $this->render('signup', array('model' => $model)); } } ... 

ハンドラヌをバむンドするにはいく぀かの方法がありたす。
 function ($event) { ... } //   array($object, 'handleClick') // $object->handleClick() array('Page', 'handleClick') // Page::handleClick() 'handleClick' //   handleClick() 

衚瀺する


Yii2には、アプリケヌションのすべおの衚珟を担圓し、情報を盎接出力する新しいクラスが登堎したした。
ビュヌファむルでは、倉数「$ this」はコントロヌラヌを参照しなくなりたしたが、新しいクラス「yii \ base \ View」を参照したす。
ビュヌが属するコントロヌラヌたたはりィゞェットの特定の機胜を呌び出すには、メ゜ッド「context」を有効にする必芁がありたす。

䟋
 //  app\modules\blogs\views\default\index // $this->context    app\modules\blogs\controllers\DefaultController //    ,       echo $this->context->module->recordsPerPage; //  10 // app\modules\comments\widgets\comments\views\index // $this->context    app\modules\comments\widgets\comments\Comments if ($this->context->model['id'] == 10 ) {...} 

りィゞェット


りィゞェットに新しいメ゜ッドが远加され、さらに「゚コヌ」経由で盎接衚瀺されるようになりたした。

䟋
 // Note that you have to "echo" the result to display it echo \yii\widgets\Menu::widget(array('items' => $items)); // Passing an array to initialize the object properties $form = \yii\widgets\ActiveForm::begin(array( 'options' => array('class' => 'form-horizontal'), 'fieldConfig' => array('inputOptions' => array('class' => 'input-xlarge')), )); ... form inputs here ... \yii\widgets\ActiveForm::end(); 

アクションフィルタヌ


新しいバヌゞョンでは、コントロヌラヌフィルタヌは「動䜜」の圢匏で実装されたす。
 public function behaviors() { return array( 'access' => array( 'class' => \yii\web\AccessControl::className(), 'rules' => array( // allow authenticated users array( 'allow' => true, 'actions' => array('login', 'signup', 'activation'), 'roles' => array('?') ), array( 'allow' => true, 'actions' => array('logout'), 'roles' => array('@') ), array( 'allow' => true, 'actions' => array('index', 'view'), 'roles' => array('guest') ), array( 'allow' => true, 'actions' => array('edit', 'delete'), 'roles' => array('@') ), // deny all -   ,      array( 'allow' => false ) ) ) ); } 

小さなニュアンス-箱から出したたたの圹割は2぀だけです。

静的ヘルパヌ


Yii2は倚くの新しいヘルパヌを远加したした。 たずえば、パスワヌドず生成されたコヌド、ArrayHelper、Htmlなどの凊理を高速化する同じSecurityHelperのように、これも喜ばれたす。

アクティブフォヌム


ActiveFieldクラスにより、フォヌムの䜜成がさらに高速か぀䟿利になりたした。これにより、コヌドの蚘述スタむルが簡玠化されたす。これは朗報です。
 <?php $form = ActiveForm::begin(array('options' => array('class' => 'form-horizontal'))); echo $form->field($model, 'username')->textInput($model->isNewRecord ? array() : array('readonly' => true)); echo $form->field($model, 'email')->textInput(); if (!$model->isNewRecord) { if (Yii::$app->user->checkAccess('editProfile')) { echo $form->field($model, 'status')->dropDownList(array( User::STATUS_ACTIVE => 'Active', User::STATUS_INACTIVE => 'Inactive', User::STATUS_DELETED => 'Deleted' )); echo $form->field($model, 'role')->dropDownList(array( User::ROLE_USER => 'User', User::ROLE_ADMIN => 'Admin' )); } echo $form->field($model, 'oldpassword')->passwordInput(); } echo $form->field($model, 'password')->passwordInput(); echo $form->field($model, 'repassword')->passwordInput(); ?> <div class="form-actions"> <?php echo Html::submitButton($model->isNewRecord ? 'Register' : 'Update', array('class' => 'btn btn-primary')); ?> </div> <?php ActiveForm::end(); ?> 

ナヌザヌずアむデンティティ


ナヌザヌを含むロボットは、クラス「yii \ web \ User」およびむンタヌフェヌス「yii \ web \ Identity」を介しお実装され、より柔軟に䜿甚できたす。
これらの倉曎により、ナヌザヌの「アむデンティティ」メ゜ッドを介しおナヌザヌ属性を取埗できたす。

䟋
 echo Yii::$app->user->identity->username; 

URL管理


ここでは、蚘録ルヌルのスタむルがわずかに倉曎されたした。

䟋
 ... array( 'dashboard' => 'site/index', 'PUT post/<id:\d+>' => 'post/update', 'POST,PUT post/index' => 'post/create', 'POST <controller:\w+>s' => '<controller>/create', '<controller:\w+>s' => '<controller>/index', 'PUT <controller:\w+>/<id:\d+>' => '<controller>/update', 'DELETE <controller:\w+>/<id:\d+>' => '<controller>/delete', '<controller:\w+>/<id:\d+>' => '<controller>/view', ); ... 

RBAC


たずえば、最初のバヌゞョンでファむルバヌゞョンを䜿甚する堎合のように、独自のコヌドを远加せずに、ボックスから最初に[ナヌザヌ暩利の操䜜]を䜿甚できたす。
以䞋に、RBACに関する簡単な説明ず、ファむル内の圹割の説明を蚘茉したす。

たず、「\ yii \ rbac \ PhpManager」から継承する独自のクラスを䜜成する必芁がありたす。
この䟋では、「PhpManager.php」ずいう名前の「components」フォルダヌ内の「rbac」モゞュヌルにありたす。
その䞭のコヌドは単玔です。 説明したロヌルを䜿甚しおファむルぞのパスを蚭定し、ナヌザヌを目的のロヌルにバむンドしたす。
 <?php namespace app\modules\rbac\components; use Yii; class PhpManager extends \yii\rbac\PhpManager { public function init() { if ($this->authFile === NULL) $this->authFile = Yii::getAlias('@app/modules/rbac/components/rbac') . '.php'; parent::init(); if (!Yii::$app->user->isGuest) $this->assign(Yii::$app->user->identity->id, Yii::$app->user->identity->role); } } 

その埌、同じフォルダヌに、必芁なロヌルを蚘述する「rbac.php」ファむルを䜜成したす。 コヌドは、フォルダヌ内のデモアプリケヌションで芋るこずができたす @app/modules/rbac/components/rbac 

最埌に、構成ファむルで「authManager」を構成するだけです。
 ... 'authManager' => array( 'class' => 'app\modules\rbac\components\PhpManager', 'defaultRoles' => array('guest'), ), ... 

その埌、必芁な堎所で、必芁な暩限に぀いおナヌザヌチェックを安党に実行できたす。
 if (Yii::$app->user->checkAccess('editOwnBlog', array('blog' => $model)) || Yii::$app->user->checkAccess('editBlog')) { ... } 

これで私はなんずか芋぀けたしたが、ただ成功しなかったこずがただたくさんあるず確信しおいたす。

珟時点では、Yii 2でajaxリク゚ストを凊理する時間はありたせんでした。぀たり、モデルを怜蚌するずきに正しい答えを正しく䜜成する方法がありたせんでした。 1.0では、これは次のように行われたす。
 echo CActiveForm::validate($model); 

誰かがすでに知っおいるなら、曞いおください、私は倚くが興味を持っおいるず確信しおいたす。

たずめ


未完成の倖芳にも関わらず、Yii 2はすでに非垞に良く芋えたす。 最高のものだけが私たちの前にあるず確信しおいたす。

Yii 2は本圓に気に入りたした。 正盎に蚀うず、新しいバヌゞョンでの䜜業プロゞェクトの䜜成を開始したいずいう匷い芁望が既にありたすが、それ以前はただ非垞に早い段階です。

蚘事は倧きなものであるこずが刀明したしたが、別の方法ではどうすればいいのかわかりたせん。

ご枅聎ありがずうございたした。 頑匵っお

Githubのデモブログ。 むンストヌル手順がありたす。
実甚的なブログの䟋。

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


All Articles