1

我使用 Security Bundle 在 Symfony 中设置了不同的身份验证角色。

* Wholesale
* Detailing
* Public

根据用户登录的身份验证,我想显示产品的不同价格。

在我的产品实体中,我有

$protected wholesalePrice;
$protected detailingPrice;
$protected publicPrice;

我可以使用一个视图来获取特定身份验证角色的价格,还是应该创建 3 个不同的视图?

4

2 回答 2

3

我建议创建一个服务和一个树枝扩展来通过您的模板访问它。

这样你只需要做类似的事情:

{{ product | priceByRole }}

这将访问处理安全逻辑的“按角色定价”服务。

服务:http ://symfony.com/doc/current/book/service_container.html 编写 Twig 扩展:http ://symfony.com/doc/2.0/cookbook/templating/twig_extension.html

树枝扩展示例:

<?php

namespace Acme\DemoBundle\Twig;

use Symfony\Component\DependencyInjection\ContainerAwareInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;

class PriceByRoleExtension extends \Twig_Extension implements ContainerAwareInterface
{
    protected $container;

    public function setContainer(ContainerInterface $container = null)
    {
        $this->container = $container;
    }

    public function getFilters()
    {
        return array(
            'priceByRole' => new \Twig_Filter_Method($this, 'priceByRoleFilter'),
        );
    }

    public function priceByRoleFilter(Item $entity)
    {
        $service = $this->container->get('my.price.service');

        return $service->getPriceFromEntity($entity);
    }

    public function getName()
    {
        return 'acme_extension';
    }
}

示例服务:

<?php

namespace Acme\DemoBundle\Service;

use Symfony\Component\Security\Core\SecurityContextInterface;
use Acme\DemoBundle\Entity\Product;

class PriceService
{
    protected $context;

    public function setSecurityContext(SecurityContextInterface $context = null)
    {
        $this->context = $context;
    }

    public function getPriceFromEntity(Product $product)
    {
        if ($this->context->isGranted('ROLE_A'))
            return $product->getWholesalePrice();

        if ($this->context->isGranted('ROLE_B'))
            return $product->getDetailingPrice();

        if ($this->context->isGranted('ROLE_C'))
            return $product->getPublicPrice();

        throw new \Exception('No valid role for any price.');
    }
}
于 2012-10-18T11:31:32.823 回答
2

您可以使用以下方法仅使用一个视图来执行is_granted()此操作:

{% if is_granted('ROLE_A') %} 
    {{ product.wholesalePrice }}
{% elseif is_granted('ROLE B') %}
    {{ product.detailingPrice }}
{% elseif is_granted('ROLE C') %}
    {{ product.publicPrice }}
{% endif %}

希望能帮助到你。

于 2012-10-18T11:27:42.330 回答