Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何使自定义操作不可访问取决于用户-Sonata Admin_Php_Symfony_Sonata Admin_Symfony Sonata_Sonata - Fatal编程技术网

Php 如何使自定义操作不可访问取决于用户-Sonata Admin

Php 如何使自定义操作不可访问取决于用户-Sonata Admin,php,symfony,sonata-admin,symfony-sonata,sonata,Php,Symfony,Sonata Admin,Symfony Sonata,Sonata,我已经像文档中一样实现了克隆操作。如何将克隆操作的访问权限限制为创建对象的用户 我的操作中已经有一个拒绝访问的异常检查,但是如果用户不是该对象的作者,我现在如何在列表视图中隐藏该按钮呢。用户应该仍然能够列出订单并显示它 这是我的路线: protected function configureRoutes(RouteCollection $collection) { $collection->add('clone', $this->getRouterIdParameter().

我已经像文档中一样实现了克隆操作。如何将克隆操作的访问权限限制为创建对象的用户

我的操作中已经有一个拒绝访问的异常检查,但是如果用户不是该对象的作者,我现在如何在列表视图中隐藏该按钮呢。用户应该仍然能够列出订单并显示它

这是我的路线:

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');
    }
}
但显然这是不可能的

有人知道怎么做吗?

我会创建检查并从操作中删除检查。检查将在操作外部的投票者中完成,并且可以在任何地方完成,包括模板。您应该检查模板,它可能已经进行了检查

此外,非主题专业提示,请始终在异常中提供消息

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

好的,这将使我必须做的一些事情变得更容易。但现在的问题仍然是,如果用户没有访问权限,我如何隐藏路由?按钮将保留在那里,如果有人单击它,将引发异常。我只希望在用户可以使用时显示该按钮。如果我和纯Symfony一起工作,这很容易做到。但是现在我用的是索纳塔。检查模板,但正如我说的,可能已经有一个检查了?或者是你自己写的模板?它应该对路由和对象使用
is_-grated()
,这将调用投票者。因此,如果要解决此问题,请执行步骤0,找到并向我们显示按钮的模板我检查了编辑和创建按钮的模板,我发现它们确实有
is_-grated()
,因此,我也将该检查添加到克隆操作中,并将其更改为我的首选项。我知道这一切都很好。我现在也明白这是怎么回事了。谢谢。很高兴知道你做到了。如果你觉得应该出现在某个地方,就考虑向医生提供一些东西。