1ページに1つのコントローラー、または1つのコントローラーに複数のページがありますか?


16

MVCの方法に関するアドバイスが欲しいだけです。codeigniterを使用していますが、Webサイトのページごとに1つのコントローラーを使用するのが良いのか、それともすべてのページに1つのコントローラーを使用するのが良いのか疑問に思っていました。

ホームページにアクセスし、ログインし、アカウントを作成して管理者に連絡できるシンプルなウェブサイトがあるとしましょう。

  1. frontend(index)、login、account、contact、またはfrontendと呼ばれる1つのコントローラー、またはlogin、createAccount、contactなどのアクションを持つコントローラーを使用する方が良いでしょうか?

  2. 状況で1つのコントローラーを使用するほうが良いかどうかはいつわかりますか?


私は常に信条に従って生きてきました。1人のコントローラーがすべてを支配し、闇の中で彼らを縛ります。(実際はそうではありませんが、私はその音が好きです。:
ピーターロウェル

回答:


16

AccountController(ログイン、登録)、PagesController(ホーム、連絡先)、Backend-> PagesController(作成、編集、削除)、UsersController(作成、編集、削除)などのロジックユニットごとにコントローラーを配置することをお勧めします。


自宅、ログイン、アカウント、連絡先など、これらの分野でWebサイトをどのように表現しますか?あなたの例のように2つのコントローラーを使用しますか?localhost /に移動した場合、homecontrollerを開き、理論的にはlocalhost / contactに移動した場合、コントローラに接続しますか?バックエンドとはどういう意味ですか?
ルシノ

それは、ページの構造とページ数に依存します。HomeController(home、contact)またはPagesController(home、contact OR details(id))を作成します。たとえば、ASP.NET MVCには、HomeページとAboutページを備えたデフォルトのHomeControllerがあります。
サンタ

私はこの方法が好きです。また、アプリケーションの特定の部分に固有ではないJquery.Ajaxを介して呼び出されるアクション用のClientController(または呼び出したいもの)。すなわち、あなたの意見のいずれかから再利用可能
クリス

私への正しい答えのようです。CodeIgniterはコントローラーのサブディレクトリを受け入れます。これにより、コントローラーをゾーンに分離できるため、最終的に2つのページコントローラー(ゾーンごとに1つ)になります。ありがとう!
ルシノ

しかし、アクションはすべて相対的ですが、やや大きなコントローラーになりませんか?それとも問題ないのですか?
キッドダイヤモンド14

4

@Rushinoここには、フロントエンド(読者用)とバックエンド(管理者用)の2つの「アプリ」があります。機能のグループごとに、コントローラーがあります。

ログインはそのようなグループであり、フォームHTMLの生成(フィールド、ビューの呼び出し)、およびフォームの処理(検証、モデルとの接続)が含まれます。したがって、「ログイン」は、generateFormとhandleFormの2つのアクションを持つコントローラーです。

ページは、ページを表示するだけのフロントエンドアプリと、編集、削除、作成、および異なる方法で表示できるバックエンドアプリに分けられます。ホームページは、少なくともフロントエンドでは「別のページ」であるため、ページコントローラーに収まります。バックエンドでは、そのロジックが完全に異なるため、異なるコントローラーを持つことを完全に正当化できます。

ユーザーの場合-ユーザーが自分自身を登録できる場合、フロントエンドコントローラーが必要になりますが、そうでない場合は、ユーザーに関するすべてがバックエンドで実行されます。

各バックエンド関数には、ジェネレーターとハンドラーの両方が必要な場合があることに注意してください。ただし、これらは、汎用のフォームジェネレーターであるプラグインを使用して、構成ファイルに分割できます。

要約すると、次のようになります。

Frontend
  Pages
    View, Handle
  Login
    View, Handle
  Users
    Register (note that the handler can be the same as 'create' on the backend)
  Contact
    View
    Handle

Backend
  Users
    Create, Delete, Edit, Update, View
  Pages
    Create, Delete, Edit, Update, View

1つのセクションが1つのアプリを表すと言ってください。それを行う興味深い方法(そしておそらくそれを行う方法)。codeigniterがこの方法でそれを行うかどうかを確認します。セッションまたは接続状態を壊すことなく、あるアプリから別のアプリに移動できることを確認する必要があります。
ルシノ

1
@Rushino CodeIgniterはこの方法でできます-Controllersディレクトリ内にフォルダーを置くことができます。「アプリ」の違いは、データベース/モデルレベルではなく、コントローラー/ビューレベルです。分離の理由は、バックエンドが非常に異なることを行っており、多くの場合完全に異なるデザインであるためです。バックエンドディレクトリ全体をIPで制限できるため、セキュリティに役立ちます。また、フロントエンドに影響を与えずにバックエンドで作業できるため、開発に役立ちます。
ダンは吹く

2

注文などに関連するすべての操作にOrdersControllerのように、ビジネスユニットごとにControllerを使用する必要があると思います。この場合、コントローラーは巨大になりますが、ヘルパークラスを使用して、モデルの初期化や部分クラスなどを別のファイルにアクションを分散させることができます。

たとえばCreate.cs and OrdersController、OrdersControllerクラスのOrdersController List.csファイルに、それぞれ対応するアクションのセットを含めることができます。物事をよりクリーンにし、注文操作を単一のコントローラークラスで集中管理します。

ちょうど2セントです。


0

私はあなたが別のアプローチを取ることができると思う:

特定のコントローラーに要求を配信するフロントドアとしての1つのメインコントローラー。この方法で、このフロントコントローラーを使用して、ユーザー認証、Googleアナリティクス、その他の一般的な操作などの一般的なことを確認し、MVC構造を純粋に保つことができます。

これは私の考えではありませんが、Symfonyフレームワークはこのように機能するため、私の経験から、これはフロントエンドを実装するための本当に素晴らしいエレガントな方法であることを伝えることができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.