Pregunta

Me gustaría hacer algo como esto.

sylius_backend_user_index:
    pattern: /
    methods: [GET]
    defaults:
        _controller: sylius.controller.user:indexAction
        _sylius:
            template: SyliusWebBundle:Backend/User:index.html.twig
            method: createFilterPaginator
            arguments: [$criteria, $sorting, $deleted, @service_container]

Me gustaría acceder a service_container en createFilterPaginator método.Puede alguien ayudarme a resolver este problema?

¿Fue útil?

Solución

Primero de todo, no hay necesidad de que todo el servicio de contenedor, sólo security.context.Supongo que ya ha extendido la UserRepository así que usted puede sobrescribir el createFilterPaginator() método y que está configurado correctamente como el sylius.repository.user servicio.

Usted tiene que agregar un simple setter a su repositorio:

class UserRepository extends BaseUserRepository
{
    protected $user;

    public setUserViaSecurityContext(SecurityContextInterface $securityContext)
    {
        $this->user = $securityContext->getToken()->getUser();
    }
}

Ahora usted tiene que manipular la definición de servicio en un compilador pasar

namespace Acme\Bundle\YourBundle\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Reference;

class ModifyRepositoryPass implements CompilerPassInterface
{
    public function process(ContainerBuilder $container)
    {
        $container
            ->findDefinition('sylius.repository.user')
            ->addMethodCall('setUserViaSecurityContext', array(
                new Reference('security.context'),
            ))
        ;
    }
}

Y llamar a este Compilador pasar en tu haces de archivo:

namespace Acme\Bundle\YourBundle;

use Acme\Bundle\YourBundle\DependencyInjection\Compiler\ModifyRepositoryPass;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\HttpKernel\Bundle\Bundle;

class AcmeYourBundle extends Bundle
{
    public function build(ContainerBuilder $container)
    {
        $container->addCompilerPass(new ModifyRepositoryPass());
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top