答えはこれだけです:
はい、できます。必要な場所にservice.containerを挿入して呼び出します$this->securityContext->isGranted('delete', $tag);
しかし、これはエンティティにサービスを注入する必要があることを意味し、それは完全に間違っています。
別の方法は、 preRemove または onFlush イベントの教義リスナー内でそれを行うことです。これはクールですが、ほとんど間違っています。voter が失敗した場合はどうしますか? 例外をスローすると、教義が破られます。また、ユーザーがいない場合はどうなりますか? その理由は、リスナーではユーザーにフィードバックを簡単に返すことができないからです。
コードベースの他の離れた場所でエラーを作成するリスクなしで、より適切で管理しやすい場所で行うことができるため、より高いレベルの抽象化でエンティティの削除をブロックすることは間違っています。
代わりにこれを試してください:
- symfony フォームを使用している場合は、次の 2 つのいずれかを実行できます。
- フォーム制約をサービスとして使用し、ここにセキュリティ コンテキストを挿入して検証を行います。間違っている場合はフォーム エラーを追加します
- コレクションを親としてサービスとしてカスタム フォームタイプを作成し、security.context を注入し、最後に PRE_SET_DATA でフォーム リスナーを使用して、何かが削除されているかどうかを確認し、現在のユーザーが isGranted で許可されているかどうかを確認します。確認が失敗した場合は、フォーム エラーを追加します。
- 単一のアクション (API など) でそれを行っている場合は、アクションまたは小枝で直接 isGranted を確認する必要があります。