web-dev-qa-db-ja.com

ユーザーと管理者が似ているが異なる機能を備えた発券システムの設計

Laravel 4.で簡単なチケットシステムを設計しています。このシステムでは、ユーザーがチケットを作成し、管理者がそれに答えるだけです。

ユーザーは次のことができるようになります。

  • hisチケットのリストを表示します。
  • 新しいチケットを作成します。
  • his自分のチケットの1つに対する返信を表示します。
  • his自分のチケットのいずれかに返信を追加します。
  • his自分のチケットの1つを閉じます。
  • URL www.example.com/supportを使用して上記のタスクを実行します

管理者は次のことができるようになります。

  • allチケットのリストを表示します。
  • できない新しいチケットを作成します。
  • anyチケットへの返信を表示します。
  • anyチケットに返信を追加します。
  • 閉じるanyチケット。
  • URL www.example.com/admin/supportを使用して上記のタスクを実行します

つまり、ユーザーと管理者は非常に似ていますが異なる機能を実行できます。 このシステムを設計して、実行する必要があるコピーと貼り付けの量を減らす方法は何ですか?

これまでのところ、私は2つの可能性を考え出しました。

  1. 2つのコントローラーを持つ2つのルートセットを作成します。1つはユーザー用で、もう1つは管理者用です。コントローラー間のほとんどのロジックをコピーして貼り付けますが、ユーザーが自分のチケットのみを表示できるようにいくつかの変数を変更します。両方のコントローラーは同じビューとモデルを共有します。ビューに追加のチェックを追加して、管理者が新しいチケットを作成するためのボタンを表示しないようにします。

    これの欠点は、特定のことを管理者から隠し、他のことをユーザーから隠すために、ビューにロジックを配置する必要があることです。また、コントローラ間でコードをコピーして貼り付けています。

  2. ルートの2つのセットを作成しますが、同じコントローラーを使用します。コントローラのifステートメントを使用して、ユーザーか管理者かによって異なるビューを表示します。

    ただし、今はビュー間でコードをコピーして貼り付けています。同じコントローラーに2つの異なるロジックセットがあると、少し混乱する可能性もあります。

これについてより良い方法はありますか?

6
Zsw

2つの異なるUIを記述します。

本当に。私はまさにそのようなシステムに毎日取り組んでおり、UserAdministratorのユーザーエクスペリエンスは完全に異なります。それらのユーザーのニーズは完全に異なるため、それらは異なります。

Administratorsは1日の大部分を費やし、その前にチケットリストを開いて、終日チケットのオン/オフを操作します。 Administrator UIは、人間が使用する主要なアプリケーションに適しているため、効率的で強力である必要があります。

Usersがまれにあなたのサイトにアクセスし、チケットを作成して、チケットをチェックして、去ります。 User UIは、理解してナビゲートしやすく、ほとんど使用する必要がないため、使用頻度の低いアプリケーションに適している必要があります。

3
Ross Patterson

役割ベースの権限を確認しましたか? 1つのコントローラー、1つのルートは、ユーザーの役割に応じて異なる結果を返す/受け入れます。

例えば。 http://blah.com/tickets へのGETリクエストは、リクエスタが管理者である場合はすべてのチケットを返し、そうでない場合はユーザー自身のチケットを返します。このルートへの投稿はユーザーに200を返しますが、管理者には40xエラー(405はここに収まると思いますか?)です。等。

1
Evgeni