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に感謝します