シンプルなブログの作成による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のデモブログ。 インストール手順があります。

実用的なブログの例。



All Articles