2016-11-28 11 views
3

Я реализовал действие клонирования точно так же, как в документации. Как я могу ограничить доступ к действию клонирования для пользователя, создавшего объект?Как сделать пользовательское действие недоступным в зависимости от пользователя - Администратор сонаты

У меня уже есть проверка запрета на доступ в моем действии, но как я могу скрыть кнопку в представлении списка, если пользователь не является автором этого объекта. Пользователь должен по-прежнему иметь возможность перечислить заказ и отобразить его.

Это мой маршрут:

protected function configureRoutes(RouteCollection $collection) 
{ 
    $collection->add('clone', $this->getRouterIdParameter().'/clone'); 
} 

И мой список полей:

protected function configureListFields(ListMapper $listMapper) 
{ 
    $listMapper 
     ->add('_action', 'actions', array(
      'actions' => array(
       'show' => array(), 
       'edit' => array(), 
       'clone' => array(
        'template' => 'AppBundle:Sonata/Button:clone_button.html.twig' 
       ), 
      ), 'label' => 'Actions' 
     )) 
    ; 
} 

и мой клон действия:

public function cloneAction($id = null) 
{ 
    $object = $this->admin->getSubject(); 
    if (!$object) { 
     throw new NotFoundHttpException(sprintf('Unable to find the object with id : %s', $id)); 
    } 

    If (!$object->isAuthor($this->getUser())) { 
     throw new AccessDeniedException(); 
    } 

    $clonedObject = clone $object; 

    $this->admin->create($clonedObject); 
    $this->addFlash('sonata_flash_success', 'Cloned successfully'); 
    return new RedirectResponse($this->admin->generateUrl('edit', array('id' => $clonedObject->getId()))); 
} 

Как вы можете увидеть в моем клоне действии, я попросите проверить, является ли пользователь автором заказа. Но как я могу полностью удалить кнопку в списке, проверив мою функцию isAuthor?

Потому что теперь пользователь может видеть кнопку, но если он несанкционирован, чтобы клонировать заказ, и он нажимает кнопку, он получает исключение, исключающее доступ. Поэтому я вообще не хочу показывать кнопку. То же самое относится к кнопке редактирования.

Я думал, что-то вроде этого:

protected function configureRoutes(RouteCollection $collection) 
{ 
    $user = $this->getConfigurationPool()->getContainer()->get('security.token_storage') 
      ->getToken()->getUser(); 

    If (!$object->isAuthor($user)) { 
     $collection->remove('edit'); 
     $collection->remove('clone'); 
    } 
} 

Но, видимо, это не может быть сделано.

Есть ли у кого-нибудь идеи, как это сделать?

ответ

2

Я бы создал a Symfony Voter и удалил чек от действия. Проверка будет сделана, в избирателе за пределами действия, и может быть сделано из любого места, включая шаблон. Вы должны проверить шаблон, возможно, он уже выполняет проверку.

Кроме того, внеконкурсный проконтакт всегда предоставляет сообщение внутри ваших исключений.

throw new AccessDeniedException('Not an author of this object'); 
+0

ОК, это сделает некоторые вещи, которые я должен сделать действительно проще. Но теперь остается вопрос, как я могу скрыть маршрут, если у пользователя нет доступа? Кнопка останется там, и если кто-то щелкнет по ней, будет выбрано исключение. Я хочу, чтобы кнопка отображалась только в том случае, если пользователь может ее использовать. Это легко сделать, если я работаю с чистым Symfony. Но теперь я пользуюсь Сонатой. –

+1

Проверьте шаблон, но, как я уже сказал, в нем, вероятно, есть чек? Или, может, ты сам написал шаблон? Он должен использовать 'is_granted()' с маршрутом и объектом, и это вызовет избирателя. – greg0ire

+0

Итак, шаг 0, если вы хотите решить это, найдите и покажите нам шаблон для кнопки – greg0ire