Symfony - 根据身份验证角色显示价格

时间:2012-10-18 11:20:45

标签: php model-view-controller symfony twig

我使用安全捆绑包在Symfony中设置了不同的身份验证角色。

* Wholesale
* Detailing
* Public

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

在我的产品实体中我有

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

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

2 个答案:

答案 0 :(得分:3)

我建议您创建一个服务和一个枝条扩展程序,以便通过模板访问它。

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

{{ product | priceByRole }}

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

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

Twig Extension示例:

<?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.');
    }
}

答案 1 :(得分: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 %}

希望它有所帮助。