0

このようなオブジェクトのインスタンスはほとんどありませんZend_Acl(モジュールごとに 1 つ):

class My_Acl_Module1 extends My_Base_Acl
{
    public function __construct()
    {
        parent::__construct();
        $this->addResource('News_Model_Entry');
        $this->deny('guest', 'News_Model_Entry', 'index', new News_Model_Acl_Assert_CategoryPrivate());
    }       
}

class My_Base_Acl extends Zend_Acl 
{
    public function __construct()
    {
              $this->addRole('guest');
    }
}

それらを 1 つの ACL オブジェクトにマージして、ナビゲーション コンテナーで使用する方法は?

編集

いくつかの詳細情報:

  • モデルベースのリソース(モデル、フォームの実装Zend_Acl_Resource_Interface)を優先してコントローラーリソースを使用しません。それらにはすべて方法がありますisAllowed()
  • モジュラー ディレクトリと再利用可能なモジュール (個別のモデル、構成、ルートなど) を使用します。
  • 私のアプリケーションは、インストールされているすべてのモジュール、コントローラー、アクションを認識しています (構造は既に解析済みで、リアルタイムではありません)

したがって、このスキームに従って、各モジュールの ACL を分離する方法を探しています。アプリケーション リソースは無駄なので使いたくない - acl は常に必要なわけではない。

本当に必要な場合にのみ、モジュール固有の ACL をインスタンス化するアクション ヘルパーがあります。ただし、グローバル アプリケーション ACL も使用できるようにしたい場合があります (たとえば、ナビゲーション ビュー ヘルパーまたはコントローラー プラグインに渡したい場合)。

私のモジュールの ACL クラスには、すべてメソッドが 1 つだけあります: init().
私が見る汚い解決策は、ソースクラスを解析し、ファイルを新しいクラスの1つのメソッドにマージすることです。

助言がありますか?

4

1 に答える 1

0

アプリケーションが自分自身についてもう少し知らなければ、これはほとんど不可能だと思います。私も少し前に同様の問題を抱えていましたが、満足のいく解決策は見つかりませんでした。マージすると、後でナビゲーションで必要になる情報 (モジュール) が失われます。

私がそこに戻った最初の解決策は、各モジュール内のすべての acl ファイルを反復処理し、それらすべてをマージするカスタム ACL マージ関数を作成することでした。これは実際に機能しましたが、アプリケーション全体をファイルスキャンするという考えは気に入りませんでした (結果がキャッシュされていたとしても)。

私の最後のアプローチは、アプリケーションにデータを追加することでした。リンク可能なアクションごとに、対応する acl ファイルを定義しました。これは思ったほど大変な作業ではありませんでした。主に、私のコントローラー/モデルがほぼ正確に一致するためです。したがって、モデル「ニュース」と、モデルへのアクセスを処理し、モデルのすべてのアクションをフロントエンドにマップするコントローラー「ニュース」があります。そのため、acl/controller の関係を指定するだけで済みました。(これを保存するために、各ナビゲーション コンテナーでカスタム要素を使用しました)。

于 2010-12-16T08:49:59.990 に答える