YiiのCRUDりィゞェットゞェネレヌタヌ

車を賌入するずきに、Habréの蚘事ず远加オプションに共通するコメントは䜕ですか







デヌタモデリングの芳点から芋るず、どちらも「ネストされた」゚ンティティであり、芪オブゞェクトから独立しお重芁な意味を持ちたせん。



Yii phpフレヌムワヌク にはGiiがありたす。これは、マりスを数回クリックするだけでデヌタモデルを䜿甚しお基本的なCRUDむンタヌフェむスを䜜成できる組み蟌みのコヌドゞェネレヌタヌです。



「ネストされた」デヌタオブゞェクトに䌌たようなものを生成できるずいいですね。 今-あなたは、詳现に぀いおはキャットぞようこそ。



蚘事の最埌で最も短気な人のために、クむックスタヌトの手順を瀺したす。



たた、この蚘事に興味がある人にずっおは、ビゞネスアプリケヌションから内郚デバむスたでの偎面が考慮されたす。





ビゞネスケヌストピックによる投皿



おそらく、habrに぀いおのコメントず悪い䟋 倚くの堎合、蚘事自䜓よりも有甚ですが、いずれにせよ、アプリケヌションを開発する際に、デヌタモデルの特定のオブゞェクトが独立した゚ンティティずしおナヌザヌにずっおあたり関心がない堎合がよくありたす。



単玔化されたビゞネスタスクを怜蚎したす。さたざたなトピックでグルヌプ化されたメッセヌゞを公開するためのWebサむトを䜜成したす。



サむトには次のむンタヌフェむスが必芁です。



  1. メむンペヌゞ-将来はさたざたなりィゞェットをサポヌトする必芁がありたすが、実装の珟圚の段階では、ある基準でフィルタヌされたトピックのリストのみがありたす。
  2. トピックの完党なリスト-テヌブル圢匏のトピックの完党なリスト。
  3. トピックペヌゞ-トピックに関する情報ずそこに公開されおいる投皿のリスト。


かなり暙準ですよね



デヌタモデルを芋おみたしょう。







驚きもありたせん。 2぀のクラスのモデルにビゞネスロゞックが含たれたす。





アプリケヌションは、2぀のコントロヌラヌによっお提䟛されたす。





朜圚的に、 PostControllerを生成するこずもできたす-管理目的および/たたはコヌドの䞀郚をカスタムりィゞェットにコピヌアンドペヌストしたすが、この蚘事の範囲倖です。

これたで、ほずんどのコヌドはgiiを䜿甚しお生成できたす。これにより、開発が高速化され、リスクが軜枛されたす手動コヌドが少ない=ミスをする可胜性が䜎くなりたす。



2぀の質問が残っおいたす。



  1. メむンペヌゞにトピックのフィルタヌされたリストを衚瀺する方法
  2. トピックごずに投皿のリストを衚瀺する方法は


自動発電機を䜿甚しおそれらを解決できる堎合-これは確実な成果になりたす。



メむンのトピックのリスト



サむト/むンデックスアドレスが提䟛するメむンペヌゞには、所定の基準でフィルタヌ凊理されたトピックのリストを含める必芁がありたす。 ビゞネスロゞックの䞀郚ずしお、モデルに含たれるフィルタヌ条件。



衚瀺のために、いく぀かの実装オプションがありたす。



最初の、汚くお速い、ビュヌファむル views / site / index.php ですべおを正しく行うこずです



  1. ActiveDataProviderを䜜成したす。
  2. トピックモデルのデヌタを入力したす。
  3. 必芁なフィヌルドを手動で指定しお、暙準のListView / GridViewりィゞェットを䜿甚しお衚瀺したす 。


さらに進んで、すべおをビュヌ/サむト/ _topic-list-widget.phpなどの別のビュヌファむルにパックし、メむンファむルからレンダヌを呌び出したす。 これにより、管理性ず拡匵性が少し向䞊したすが、それでもかなり汚れおいたす。



ほずんどの堎合、すべおのルヌルに埓っお、個別の名前空間䜿甚しおいるバヌゞョンに応じお、 アプリ\りィゞェットたたは基本テンプレヌトのアプリ\コンポヌネント で、モデルごずにActiveDataProviderの䜜成をカプセル化し、個別に衚瀺する個別のりィゞェットを䜜成したす提出。 残るのは、メむンペヌゞからこのりィゞェットを呌び出すこずだけです。 この゜リュヌションは、クラスの分解、制埡性、コヌドの拡匵性の点で最も正確です。



しかし、このりィゞェットのコヌドはactionIndexの凊理に関しおTopicControllerコヌドを非垞に繰り返すず感じたすか そしお、このコヌドを手動で曞くのはずおも面倒です。



このコヌドを自動的に生成し、完成したりィゞェットを呌び出すだけの方がはるかに良いでしょう



<?= \app\widgets\TopicControllerWidget::widget([ 'action' => 'index', 'params' => [ 'query' => app\models\Topic::findBySomeSpecificCriteria() ], ]) ?>
      
      





関連する投皿のリスト

トピック/ビュヌアドレスが提䟛するトピックを衚瀺するペヌゞには、トピック自䜓に関する情報ず、そこに公開されおいるメッセヌゞのリストを含める必芁がありたす。 テヌブル間の関係を正しく構成するず、モデル内のトピックのメッセヌゞのリストが自動的に取埗されるため、衚瀺の質問のみが残りたす。



フィルタヌされたトピックのリストずの類掚により、ほが同じオプションがありたす。



1぀目は、ビュヌファむルのコヌドですべおを実行しおトピックを衚瀺するこずです views / topic / view.php 。



  1. ActiveDataProviderを䜜成したす。
  2. モデルからのデヌタを入力$ model-> getPosts ;
  3. 必芁なフィヌルドを手動で指定しお、暙準のListView / GridViewりィゞェットを䜿甚しお衚瀺したす 。


2぀目は、このコヌドを別のプレれンテヌションファむル、 views / topic / _posts-list-widget.phpに分離するこずです。目障りにならないように-どこかで再利甚するず倱敗したす。



3番目は本栌的なりィゞェットで、 actionIndex郚分の条件付きPostControllerのコヌドを倧郚分耇補したすが、手動で䜜成されたす。



たたは、コヌドを自動的に生成し、完成したりィゞェットを呌び出したす。



 <?= app\widgets\PostControllerWidget::widget([ 'action' => 'index', 'params' => [ 'query' => $model->getPosts(), ], ]) ?>
      
      





内郚CRUDに基づくgiiゞェネレヌタヌ



ビゞネスタスクが定矩され、生成されたりィゞェットの芁件が抂説され、どのように正確に生成されるかがわかりたす。 GiiにはすでにCRUDコントロヌラヌ甚のゞェネレヌタヌがありたす。 CRUDりィゞェットの堎合、既存のゞェネレヌタヌに基づいお新しいゞェネレヌタヌを䜜成する必芁がありたす。



開始前のドキュメントぞのリンク-独自の拡匵機胜を䜜成する堎合にも圹立ちたす。





明らかに、すべおの機胜はYii拡匵機胜にパッケヌゞ化されおいたす。Yii拡匵機胜は、コンポヌザヌを介しおむンストヌルされ、プロゞェクトのベンダヌフォルダヌに入りたす。



拡匵機胜は3぀の郚分で構成されたす。



  1. giiゞェネレヌタヌテンプレヌトを含むtemplates / crudディレクトリ 。
  2. Controller.phpファむル-りィゞェット呌び出し甚の組み蟌みファサヌドコントロヌラヌ。
  3. Widget.phpファむルは、生成されたすべおのりィゞェットの基本クラスです。






Gii Generatorテンプレヌト



拡匵機胜はコヌドを生成する必芁があるため、その䞭心郚分はGiiゞェネレヌタヌです。



最初は、拡匵機胜を実装するには、組み蟌みのCRUDコントロヌラゞェネレヌタ甚の独自のテンプレヌトを䜜成するだけで十分であるず想定されおいたした。 ずころで、これがディレクトリがゞェネレヌタではなくテンプレヌトず呌ばれる理由です。 しかし、CRUD-Controllerゞェネレヌタヌは入力デヌタの非垞に集䞭的な怜蚌を行うため、たずえば継承のためにクラスを倉曎するなど、倚くの芁件を実装できたせんでした。 したがっお、拡匵機胜にはテンプレヌトだけでなく、本栌的なゞェネレヌタヌが含たれおいたす。



giiゞェネレヌタヌは、次の郚分で構成されおいたすすべおテンプレヌト/ crudディレクトリ内にありたす。





Generator.phpおよびform.phpファむルには、䞻にCRUDゞェネレヌタヌからの元のファむルず比范しお、ファむル名、怜蚌、説明、およびツヌルチップテキストなどの衚面的な倉曎が含たれおいたす。



テンプレヌトファむルは、生成されたビュヌずりィゞェットコヌド自䜓を担圓したす。 たず、ファむルテンプレヌト/ crud / default / controller.phpが重芁です。これは、元のゞェネレヌタヌのコントロヌラヌクラスに察応するりィゞェットクラスを盎接生成する圹割を果たしたす。



りィゞェットはCRUDコントロヌラヌず同じアクションを持぀必芁がありたすが、生成方法が少し異なりたす。 以䞋の䟋は、コメント付きの生成結果を瀺しおいたす。





最埌に、ビュヌファむルには次の基本的な線集が含たれたす。





りィゞェットの基本クラス



ゞェネレヌタヌが䜜業を完了するず、アプリケヌションの名前空間にりィゞェットクラスが䜜成されたす。 継承チェヌンは次のようになりたす。アプリケヌション甚に生成されたりィゞェットは、ベヌス拡匵りィゞェットclass \ ianikanov \ wce \ Widgetから継承され、次に、ベヌスYiiりィゞェットclass \ yii \ base \ Widgetから継承されたす。



拡匵りィゞェットの基本クラスは、次のタスクを解決したす。



  1. 2぀の䞻芁なフィヌルドを定矩したす$ actionおよび$ params。これらを介しお、呌び出しビュヌからりィゞェットに制埡が転送されたす。
  2. 生成されたクラスでオヌバヌラむドできる倚数の暙準パラメヌタヌを定矩したす。たずえば、りィゞェットのビュヌファむルぞのパス、ファサヌドコントロヌラヌぞの名前ずパス以䞋に぀いお、゚ラヌメッセヌゞなどです。
  3. ビュヌをレンダリングするずきの暙準パラメヌタヌを定矩したすrenderおよびrenderFile;
  4. AccessControlやVerbFilterなどの暙準フィルタヌが機胜するように、コントロヌラヌむンフラストラクチャに類䌌したむベントむンフラストラクチャを提䟛したす。
  5. これらすべおを䞀緒に収集するrunメ゜ッドを定矩したす。


統合ファサヌドコントロヌラヌ

これらのデヌタの衚瀺に問題はありたせん-りィゞェットはこの目的のためのものです。 しかし、線集には、誰が蚀っおも、コントロヌラヌが必芁です。 りィゞェットごずに固有のコントロヌラヌを生成したす-その本質はすべお倱われたす。 暙準のCRUDを䜿甚するこずは必ずしも適切ではないため、GIIの远加起動に䟝存したくありたせん。 したがっお、このオプションは、汎甚の統合コントロヌラヌファサヌドで䜿甚されたした。



このコントロヌラヌは、構成ファむルを介しおアプリケヌションマップに登録され、次のアクションを実行するactionIndexずいう1぀のメ゜ッドのみが含たれおいたす。



  1. クラむアントからのリク゚ストを受け入れたす。
  2. 制埡を察応するりィゞェットクラスに転送したす。
  3. りィゞェットの結果ずしおのビゞネス゚ラヌを凊理したす。
  4. メむンアプリケヌションにリダむレクトしたす。


おそらく、このコントロヌラヌがしおいないこずを瀺すこずがより重芁です



  1. アクセスレベルはチェックしたせん-このロゞックは特定のりィゞェットに属したす。
  2. 入力操䜜は実行されたせん。パラメヌタヌはそのたたりィゞェットに枡されたす。
  3. 定矩枈みの成功コヌドを確認する堎合を陀き、出力を操䜜したせん。


このアプロヌチにより、ファサヌドの汎甚性を維持し、セキュリティ芁件やアプリケヌションアプリケヌションコヌドなどのビゞネス芁件の実装を残すこずができたす。



クむックスタヌト

ビゞネス䞊の課題は明確で、開始する準備はできおいたすか 拡匵機胜の䜿甚には4぀の手順がありたす。



  1. むンストヌル;
  2. 構成;
  3. 䞖代;
  4. アプリケヌション。


拡匵機胜のむンストヌルは、composerを䜿甚しお行われたす。



 php composer.phar require --prefer-dist ianikanov/yii2-wce "dev-master"
      
      





次に、アプリケヌション構成ファむルにいく぀かの倉曎を加える必芁がありたす。



たず、参照をgiiゞェネレヌタヌに远加したす。



 if (YII_ENV_DEV) { $config['modules']['gii'] = [ 'class' => 'yii\gii\Module', 'allowedIPs' => ['127.0.0.1', '::1', '192.168.0.*', '192.168.178.20'], 'generators' => [ //here 'widgetCrud' => [ 'class' => '\ianikanov\wce\templates\crud\Generator', 'templates' => [ 'WCE' => '@vendor/ianikanov/yii2-wce/templates/crud/default', // template name ], ], ], ]; }
      
      





次に、統合されたファサヌドコントロヌラヌをマップに远加したす。



 $config = [ ... 'controllerMap' => [ 'wce-embed' => '\ianikanov\wce\Controller', ], ... ];
      
      





これでむンストヌルず蚭定が完了したした。



りィゞェットを生成するには



  1. giiを開きたす。
  2. 「CRUD Controller Widget」を遞択したす;
  3. フォヌムフィヌルドに入力したす。
  4. コヌドを衚瀺しお生成したす。


さらに、りィゞェットを䜿甚するには、アクションずパラメヌタヌを指定しお呌び出す必芁がありたす-コントロヌラヌが呌び出されるのずほが同じです。



モデルのリストを衚瀺するためのりィゞェット



 <?= app\widgets\PostControllerWidget::widget([ 'action' => 'index', 'params' => [ 'query' => $otherModel->getPosts(), ], ]) ?>
      
      





1぀のモデルを衚瀺するためのりィゞェット



 <?= app\widgets\PostControllerWidget::widget(['action' => 'view', 'params' => ['id' => $post_id]]) ?>
      
      





モデル䜜成りィゞェットボタン+フォヌムをModalでラップ



 <?= app\widgets\PostControllerWidget::widget(['action' => 'create']) ?>
      
      





モデル倉曎りィゞェットボタン+フォヌムをモヌダルでラップ



 <?= app\widgets\PostControllerWidget::widget(['action' => 'update', 'params'=>['id' => $post_id]]) ?>
      
      





モデル削陀りィゞェットボタン



 <?= app\widgets\PostControllerWidget::widget(['action' => 'delete', 'params'=>['id' => $post_id]]) ?>
      
      





りィゞェットずすべおのビュヌのコヌドはアプリケヌションに属し、簡単に倉曎するこずができたす-すべおがコントロヌラヌを生成するずきずたったく同じです。



サポヌトず開発に぀いお



拡匵がどのようにサポヌトおよび開発されるかに぀いおのいく぀かの蚀葉。 私は䞻な仕事ず私の「サむド」プロゞェクトペットプロゞェクトをいく぀か持っおいたす。 したがっお、この拡匵機胜は私のサむドプロゞェクトからのサむドプロゞェクトであるため、プロゞェクトのニヌズに合わせお拡匵機胜を開発したす。



オヌプン゜ヌスの最良の䌝統では、コヌドはgithubで利甚できたす。バグの修正に関しおはサポヌトしたす。たた、プルリク゚ストを送信したい人がいる堎合はタむムリヌなレビュヌを行うようにしたす。



All Articles