1

バックストーリー:

Symfony 2.2.1 の使用

コントローラー アクションにアタッチするアクセス許可のカスタム アノテーションを作成しました。元:

/**
 * @Route("/", name="lg.user.usermanager.index")
 * @Template
 * @Permissions(perm="lg.user.usermanager.index", desc="Lists all users")
 */
public function indexAction(){ ... }

すべてのリクエストにアタッチし、ユーザーがそのアクションにアクセスする権限を持っていることを確認するリスナーをセットアップしました。たとえば、ユーザーに「lg.user.usermanager.*」権限が付与されている場合、そのユーザーはそのパターンに一致するすべてのアクションにアクセスできます。lg.user.usermanager.create、lg.user.usermanager.index、lg.user.usermanager.edit はすべてそれに一致します。

それを念頭に置いて、ルートパラメーターもチェックされます。そう

/**
 * ...
 * @Permissions(perm="lg.user.usermanager.edit", desc="Allows for a particular user to be editted")
 */
 public function editAction(User $user)

ユーザーがユーザー「test」を編集できるようにするには、権限「lg.user.usermanager.edit.test」または「lg.user.usermanager.edit.*」が必要です。

問題:

現在、すべてのユーザーまたはグループのアクセス許可ノードを手動で入力する必要があります。利用可能なノードのリストからノードを選択できる方法を考え出そうとしています。非常に原始的なコマンドを作成しました。これはすべてのファイルをループし、正規表現を使用すると、ノードと説明を引き出してテーブルに更新できるパターンに一致します。

これに関する問題は、可能な「*」ノードを考慮していないことと、すべてのアクションの追加パラメーターを考慮していないことです。

可能な解決策

私がやりたいことは、アプリケーション内のすべてのコントローラーのリストを(動的に)何らかの方法で取得し、アノテーションリーダーを使用して、アクセス許可のアノテーションと、チェックする追加のルートパラメーターの両方を取得できるようにすることです。それらを使用して、使用可能なノードを一覧表示できるソリューションを考案できると思います。

ただし、より良い解決策を知っているか、推奨したい場合は、この時点で何でも受け入れます.

4

1 に答える 1

3

ずいぶん前のことですが、他のユーザーに役立つかもしれません。

コントローラーを取得する公式の方法はありませんが、次のコードを使用してすべてのコントローラーを取得できます。

$bundles = $this->container->getParameter('kernel.bundles');
$controllers = [];
foreach ($bundles as $bundle) {
    $reflection = new \ReflectionClass($bundle);
    $controllerDirectory = dirname($reflection->getFileName()) . '/Controller';
    if (file_exists($controllerDirectory)) {
        $d = dir($controllerDirectory);
        while (false !== ($entry = $d->read())) {

            if (preg_match("/^([A-Z0-9-_]+Controller).php/i", $entry, $matches)) {                        
                $controllers[] = ['fileName' => $controllerDirectory. '/'. $entry, 'class' => $reflection->getNamespaceName() . '\Controller\\' . $matches[1]];
            }
        }
        $d->close();
    }
}
print_r($controllers);
于 2015-12-16T10:34:08.773 に答える