1

セキュリティバンドルを使用してSymfonyでさまざまな認証ロールを設定しています。

* Wholesale
* Detailing
* Public

ユーザーがログインしている認証に基づいて、製品のさまざまな価格を表示したいと思います。

私の製品エンティティには

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

1つのビューを使用してその特定の認証ロールの価格を取得できますか、それとも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

Twig拡張の例:

<?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()次のように使用すると、1つのビューでのみ実行できます。

{% 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 に答える