我使用安全捆绑包在Symfony中设置了不同的身份验证角色。
* Wholesale
* Detailing
* Public
根据用户登录的身份验证,我想显示产品的不同价格。
在我的产品实体中我有
$protected wholesalePrice;
$protected detailingPrice;
$protected publicPrice;
我可以使用一个视图来获取特定身份验证角色的价格,还是应该创建3个不同的视图?
答案 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 %}
希望它有所帮助。