我使用 Security Bundle 在 Symfony 中设置了不同的身份验证角色。
* Wholesale
* Detailing
* Public
根据用户登录的身份验证,我想显示产品的不同价格。
在我的产品实体中,我有
$protected wholesalePrice;
$protected detailingPrice;
$protected publicPrice;
我可以使用一个视图来获取特定身份验证角色的价格,还是应该创建 3 个不同的视图?
我使用 Security Bundle 在 Symfony 中设置了不同的身份验证角色。
* Wholesale
* Detailing
* Public
根据用户登录的身份验证,我想显示产品的不同价格。
在我的产品实体中,我有
$protected wholesalePrice;
$protected detailingPrice;
$protected publicPrice;
我可以使用一个视图来获取特定身份验证角色的价格,还是应该创建 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.');
}
}
您可以使用以下方法仅使用一个视图来执行is_granted()
此操作:
{% if is_granted('ROLE_A') %}
{{ product.wholesalePrice }}
{% elseif is_granted('ROLE B') %}
{{ product.detailingPrice }}
{% elseif is_granted('ROLE C') %}
{{ product.publicPrice }}
{% endif %}
希望能帮助到你。