2

Laravel アプリケーションのビジネス ロジックのコード構造、主に行レベルのパーミッションについて、他の意見をお聞きしたいと思います。

ご存じない方のために説明すると、Laravel は Rails によく似た PHP 用の MVC フレームワークです。

理解を深めるために、各ユーザーが自分のアルバムと写真を持っているマルチテナント アプリケーションを想定してみましょう。

  • これで、各ユーザーは他のユーザーを自分のアルバムに (写真をアップロードして) 共同作業するように招待できます。
  • 写真をアップロードしたアルバムの所有者と共同編集者の両方が、その写真に関する情報を削除または更新できる場合があります。
  • 所有者のみがアルバムを編集し、新しい共同編集者を招待できます。
  • 共同編集者は、必要に応じて自分自身をアルバムから削除できます。

Pinterest は似たような例の良い例ですが、私たちのアプリケーションはおそらく 3 倍から 4 倍複雑です。問題は、そのようなロジックをどこで処理する必要があるかです。

Laravel は、リポジトリ、エンティティ、およびサービスを使用するアプローチを提案していますが、おそらく良い例が不足しているため、完全には理解できません。したがって、これらの期限を守るための最初の選択肢は、すべてをコントローラーに任せることでした (うーん!)。さて、リファクタリングを掘り下げると、コードのスパゲッティ化を解除する方法はたくさんあります。

  • 行レベルで ACL を実装している人々を見てきました (ちょっとばかげてやり過ぎに見えます)
  • モデルをデータ コンテナーだけでなく、動作認識オブジェクトに変換$album->add_photo($photo)して、その関数でパーミッションをチェックすることも可能です。
  • モデルの save メソッドをオーバーライドして、そこでそれらのチェックを行うことも可能です。
  • または、Laravel が提案した個別の関心層を持つ道に従ってください

次のようなメソッドを使用すると$album->can_be_edited_by($user)、許可されていないルートでの 404 エラーの表示、ビューのリンクの非表示、およびモデルを保存する前の検証が簡素化される可能性があると思います

.NET を使用していないリポジトリ、エンティティ、およびサービスの単純だが理解しやすい例を知っている人はいますか? ありがとう!

編集:各ユーザーには何千ものリソースが関連付けられている可能性がありますが、関連付けの種類ごとに 1 つのロールしかないため、完全な ACL システムは過度のオーバーヘッドを引き起こすと思います。たとえば、写真には がありuploader_id、アルバムには がありowner_idます。

4

2 に答える 2

1

私は間違っているかもしれませんが、ACL は OBJECT ベースのアクセス許可だと思います (つまり、ユーザーは GENERAL で写真を削除できる、または削除できない)。必要なのは、よりカスタムの MODEL ベースのアクセス許可 (あなたが言ったような行レベル) です。つまり、ユーザーは自分で作成した写真 (特定のもの) を削除できます。

ほとんどの Laravel パッケージはオブジェクト ベースのアクセス許可用に設計されていると思いますが、https://github.com/deefour/authorizerではありません。これは素晴らしい隠れた逸品です。私たちのプロジェクトでは使用していませんが、必要なすべてのベースを実際にカバーしていることがわかりました.

アプリには非常に高度なモデル権限があり、モデル全体に​​散らばっていますが、非常にモデル中心のアプローチを採用しており、必ずしも「laravel風」であるとは限りません。削除の例では、モデルの削除メソッドをオーバーライドするか、雄弁なイベントをリッスンしてそこで防止します。特定の属性の読み取り/書き込みを防止する必要がある場合は、バリデーターを拡張するか、カスタムのミューテーター/ゲッター、シリアライザーを使用するか、イベントをリッスンすることでそれを行うこともできます。ここで私の質問/回答にビジネスロジックを追加する場所の詳細: https://stackoverflow.com/a/27804817/796437

私はまだ最善のアプローチを見つけようとしていますが、そうする場合はこれを更新しますが、投稿すると思いました。

于 2016-12-22T05:51:14.843 に答える