Yiiでフロントエンド/バックエンドパーツを分割する方法

私は何について話しているのですか?



Yiiのすべてのプロジェクトで、サイトのフロントエンド/バックエンド部分をどのように共有するかについて少しお話ししたいと思います。 私はこの方法の作者であると主張するのではなく、それがどのように構成され、どのように機能するかを少し説明したいだけです。



実際、ほとんどの場合、プロジェクトはフロントエンド(つまり、訪問者が見るもの)だけで構成することはできません。 多くの場合、すべてのプロジェクトコンポーネント(モデル、拡張機能など)に簡単にアクセスしながら、管理部分を整理する必要があります。



これを実現するにはいくつかの方法があります。 それぞれの詳細については説明しません。興味がある場合は、 yiiframework.comフォーラムを検索してください

最もエレガントで便利なオプションは、その「動作」を使用してアプリケーションを起動するように思えました。 これにより、ディレクトリの観点からアプリケーションを非常に便利に区別したり、サイトの各部分に異なる構成を使用したりすることができます。





Yiiに精通している場合は、Yiiがいわゆるbehaviorsを実装していることを知っておく必要があります。これにより、さまざまなコンポーネントの機能と動作を変更または補完できます。 ほとんどの場合、それらはモデルと組み合わせて使用​​されますが、私たちのケースでは、ビヘイビアを直接使用してアプリケーションを起動することが提案されています。



ディレクトリ



まず、ディレクトリを決めましょう。 サイト(フロントエンド)のユーザー部分のコントローラーが「protected / controllers / frontend」フォルダーに保存されることに同意しましょう。 adminコントローラーを「protected / controllers / backend」フォルダーに保存するのは論理的です。

マッピングについても同じです。 フロントエンドの場合、これは「protected / views / frontend」フォルダであり、バックエンドの場合は「protected / views / backend」です。

実際、次のようになります。

画像



コントローラー



明らかに、管理パネルのコントローラーが外部コントローラーと同様に機能することは望ましくありません。 たとえば、特定のユーザーロールに対してのみ管理パネルでアクセスフィルターを設定します。

麺を繁殖させず、フィルター付きの各コントローラー(DRY!)で繰り返さないために、中間コントローラー-FrontEndControllerおよびBackEndControllerを作成します。これらはベースコントローラーから継承し、 「protected / components」フォルダーに配置します。



これらのコントローラーは次のようになります。



FrontEndController.php:

class FrontEndController extends BaseController { //  public $layout = 'application'; //  public $menu = array(); //  public $breadcrumbs = array(); }
      
      







BackEndController.php:

 class BackEndController extends BaseController { //  public $layout = 'application'; //  public $menu = array(); //  public $breadcrumbs = array(); /*  */ public function filters() { return array( 'accessControl', ); } /*   */ public function accessRules() { return array( //     array( 'allow', 'roles'=>array('admin'), ), //         array( 'allow', 'actions'=>array('login'), 'users'=>array('?'), ), //    array( 'deny', 'users'=>array('*'), ), ); } }
      
      







実際、BackEndControllerがバックエンドをend索好きな目から隠し、ログインのみを許可するフィルターを実装することを除いて、これらは同一です。 同時に、両方とも共通の機能と動作を持つことができ、必要に応じて、継承したBaseControllerで作成できます。



個人的には、BaseControllerで、非常に頻繁に使用されるさまざまな機能の便利なショートカットを作成します。



BaseController.php:

 class BaseController extends CController { // -  public function setNotice($message) { return Yii::app()->user->setFlash('notice', $message); } // -  public function setError($message) { return Yii::app()->user->setFlash('error', $message); } }
      
      







それで、すべてが明確です- 「protected / controllers / backend」にあるすべてのコントローラーはBackEndControllerを継承します「protected / controllers / frontend」にあるものはFrontEndControllerです。



振る舞い



次に、これらすべてがどのように機能するかを直接説明します。 これを行うために、 「protected / behaviors」フォルダーに新しい動作-WebApplicationEndBehaviorを作成します。 彼らが言うように、そのコードは十分です。 しかし、コメントでは何と理由を説明します。



WebApplicationEndBehavior.php

 class WebApplicationEndBehavior extends CBehavior { //      private $_endName; //  $_endName; public function getEndName() { return $this->_endName; } //   public function runEnd($name) { $this->_endName = $name; //     $this->onModuleCreate = array($this, 'changeModulePaths'); $this->onModuleCreate(new CEvent ($this->owner)); $this->owner->run(); } //   onModuleCreate public function onModuleCreate($event) { $this->raiseEvent('onModuleCreate', $event); } //     protected function changeModulePaths($event) { //     (frontend  backend)  ,         $event->sender->controllerPath .= DIRECTORY_SEPARATOR.$this->_endName; $event->sender->viewPath .= DIRECTORY_SEPARATOR.$this->_endName; } }
      
      







とても簡単です。 サイトパーツの名前(フロントエンド/バックエンド)を指定したrunEnd($ name)関数呼び出しは、onModuleCreateイベントハンドラーによってハングアップし、ハンドラーでコントローラーとマッピングへのパスを変更し、必要な「サフィックス」を追加します。

フレームワークがスタートアップクラスを探すパスにこのコンポーネントを追加するだけです。

「protected / config / main.php」に次を追加します。

 ... //    'behaviors'=>array( 'runEnd'=>array( 'class'=>'application.behaviors.WebApplicationEndBehavior', ), ), ...
      
      







構成



サイトの各部分をフォルダーの場所レベルだけでなく、アプリケーション構成レベルでも分離すると非常に便利です。 これを行うには、 「protected / config」フォルダー-backend.phpfrontend.phpに個別の構成ファイルを作成します。

これらは次のようになります。

backend.php

 return CMap::mergeArray( require_once(dirname(__FILE__).'/main.php'), array( //   'defaultController' => 'posts', //  'components'=>array( //  'user'=>array( 'loginUrl'=>array('/users/login'), ), // mailer 'mailer'=>array( 'pathViews' => 'application.views.backend.email', 'pathLayouts' => 'application.views.email.backend.layouts' ), ), ) );
      
      







フロントエンドでも同様に。

たとえば、これは私にとってconfigフォルダーの外観です。

画像



ブートストラップ



次に、入力スクリプトを設定するだけです。 ここでは、通常、アプリケーションのルートにindex.phpadmin.phpの 2つのファイルを作成します。 含まれるコードは次のとおりです。



index.php

 //        $yii = dirname(__FILE__).'/../yii/framework/yii.php'; $config = dirname(__FILE__).'/protected/config/frontend.php'; //  ? defined('YII_DEBUG') or define('YII_DEBUG', true); defined('YII_TRACE_LEVEL') or define('YII_TRACE_LEVEL', 3); //   require_once($yii); //      WebApplicaitonEndBehavior,  ,     Yii::createWebApplication($config)->runEnd('frontend');
      
      







admin.php

 //        $yii = dirname(__FILE__).'/../yii/framework/yii.php'; $config = dirname(__FILE__).'/protected/config/backend.php'; //  ? defined('YII_DEBUG') or define('YII_DEBUG', true); defined('YII_TRACE_LEVEL') or define('YII_TRACE_LEVEL', 3); //   require_once($yii); //      WebApplicaitonEndBehavior,  ,     Yii::createWebApplication($config)->runEnd('backend');
      
      







これで、 http://localhost/yourapp/index.php (またはあなたが何であるか)に変わります-サイトのフロントエンドに移動し、 http://localhost/yourapp/admin.phpに変わります-アプリケーションが管理部分を読み込みます。



私の意見では、非常に便利です-すべてが明確に線引きされ、各パーツは独自の設定を持ち、コントローラーとビューを別々のフォルダーに保存し、ファイルに混乱や混乱を生じさせません。



実際、これは私が多くの人にとってこの非常に頻繁に生じる質問についてあなたに伝えたかったことのすべてです。



一般的に、Yiiはhabrではむしろ重要ではありません。 しかし、個人的には-これは、PHPフレームワークの中で明らかなナンバー1です。 あなたがYiiに関する記事に興味があるなら、コメントのヒント。



All Articles