Symfony 2のカスタムアノテーション

Symfony2は最近のWebフレームワークです。 したがって、開発者は単に価値のあるドキュメントを作成する時間を持っていませんでした。 現在のプロジェクトの1つはMongoDBを使用しており、ACLを固定できます。ACLプロバイダーを作成するだけです。 しかし、私は自分の道を行くことにしました。 そのため、ここで得られることは次のとおりです。
class DefaultController extends Controller { /** * Dashboard page. * @Permissions(perm="dashboard_view") * @Route("/", name="ITEDashboardBundle_index") * @Template() * @return array */ public function indexAction() {....... 



ご覧のとおり、ここではルートとテンプレートの注釈が標準であり、それらについては説明しません。 独自のPermissionsアノテーションに興味があります。

さあ、始めましょう。
最初に、カーネルに新しいアノテーションが追加されたことを示すアノテーションクラスを作成する必要があります。
 namespace SomeNameSpace\SomeBundle\Annotations; /** * @Annotation */ class Permissions { public $perm; } 

したがって、注釈は@Permissionsタイプ(perm = "some_value")になります
次のステップは、注釈を読み取り、その値に応じていくつかのアクションを実行するサービスを作成することです。
 namespace SomeNamespace\SomeBundle\Annotations\Driver; use Doctrine\Common\Annotations\Reader;//        use Symfony\Component\HttpKernel\Event\FilterControllerEvent;//    use SomeNamespace\SomeBundle\Annotations;//   use SomeNamespace\SomeBundle\Security\Permission; //      permission to user use Symfony\Component\HttpFoundation\Response; //        403,    use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException; class AnnotationDriver{ private $reader; public function __construct($reader) { $this->reader = $reader;//   } /** *        */ public function onKernelController(FilterControllerEvent $event) { if (!is_array($controller = $event->getController())) { //,    return; } $object = new \ReflectionObject($controller[0]);//   $method = $object->getMethod($controller[1]);//   foreach ($this->reader->getMethodAnnotations($method) as $configuration) { //   if(isset($configuration->perm)){//   ,     $perm = new Permission($controller[0]->get('doctrine.odm.mongodb.document_manager')); $userName = $controller[0]->get('security.context')->getToken()->getUser()->getUserName(); if(!$perm->isAccess($userName,$configuration->perm)){ //    ,   403 throw new AccessDeniedHttpException(); } } } } } 

ドクトリンの注釈のリーダーを使用していることに注意してください。 しかし、今日の教義はsymfony2の不可欠な部分となっています。
はい そして最後のステップですが、それほど重要ではありません。 次に、カウンターフックフックを登録する必要があります。または、正しく名前を付ける場合は、EventListener
 # SomeBundle\config\services.yml services: some_annotation_driver: class: SomeNamespace\SomeBundle\Annotations\Driver\AnnotationDriver #  tags: [{name: kernel.event_listener, event: kernel.controller, method: onKernelController}] #       arguments: [@annotation_reader] #  annotation_reader     


これですべてです! これで注釈の使用準備が整いました。
PSバンドルとコントローラーで注釈を使用するには、クラスに注釈を接続するだけで済みます。
 namespace SomeNamespace\SomeBundle\Controller; use SomeNamespace\SomeBundle\Annotations\Permissions; /** * Dashboard controller. * * @Route("/dashboard") */ class DefaultController extends Controller { /** * Dashboard page. * @Permissions(perm="dashboard_view") * @Route("/", name="ITEDashboardBundle_index") * @Template() * @return array */ public function indexAction() {...} } 

UPD:通常のコードの強調表示を行いました。sHinEに感謝します

Source: https://habr.com/ru/post/J133270/


All Articles