次の関係を持つモデルがあり、ユーザーが多くのグループに所属できる状況を定義し、複数のグループにプロジェクトへのアクセスを許可できます。
User
HABTM Group
HABTMProject
find()
プロジェクト モデルで実行された結果が、現在のユーザーがグループ メンバーシップに基づいてアクセスできる結果のみを返すように設定したいと思います。
私の最初の考えは、beforeFind()
コールバックを使用してクエリを変更することです。しかし、2 レベルの関連付けには困惑しました。モデルを再バインドすることで、同様の問題 (この質問を参照) を解決しました。ただし、これはカスタムの find メソッドの場合でした。任意のクエリを変更する必要がある、このような一般的な状況では、このアプローチは機能しないと思います。
を使用afterFind()
して結果をフィルター処理することは、適切な数のレコードが返されない場合などにページネーションが混乱するため、お勧めできません。
最後に、車輪を再発明しようとしているのではないかというしつこい疑いがあります。CakePHP で見たアクセス制御 (Cake ACL など) は、モデル/レコード レベルではなく、コントローラー/アクション レベルで行われていましたが、これは解決された問題だと思います。
編集:最終的にこれは複雑すぎると判断getAccessibleByUser($id)
し、Project モデルにメソッドを追加しました。ただし、この種の制限をすべての操作にグローバルに追加できるかどうかはまだ興味がありfind()
ます。でやりたいこととまったく同じように思えますがbeforeFind()
、(DavidYell が以下で示唆しているように) 答えは Containable 動作にあるのではないかと思います。