2012-10-18 90 views
1

我在Symfony中使用安全捆綁軟件設置了不同的身份驗證角色。Symfony - 根據身份驗證角色顯示價格

* Wholesale 
* Detailing 
* Public 

基於用戶登錄的身份驗證我想顯示產品的不同價格。

在我的產品實體我有

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

我可以用一個視圖來獲取價格爲特定的認證角色,或者我應該創建3個不同的看法?

回答

3

我建議創建一個服務和一個樹枝擴展來通過你的模板來訪問它。

這樣,你只需要像做:

{{ product | priceByRole }} 

這將「按角色價」訪問服務,處理安全邏輯。

服務:http://symfony.com/doc/current/book/service_container.html 寫的樹枝延伸: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.'); 
    } 
} 
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 %} 

希望它能幫助。

+2

@Alex喬伊斯的答案是比我好。我的解決方案更直接,但如果您需要此角色,請選中幾個模板,您應該選擇Service + Twig Extension解決方案。 –

相關問題