テンプレートを介してアクセスするためのサービスと小枝拡張を作成することをお勧めします。
そうすれば、次のようなことをするだけで済みます。
{{ 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.');
}
}