Acesso do usuário conectado no momento em UserRepository em Sylius
Pergunta
Eu gostaria de fazer algo como isto.
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]
Eu gostaria de de acesso service_container em createFilterPaginator
o método.Qualquer um pode me ajudar a resolver este problema?
Solução
Primeiro de tudo, não há necessidade para todo o contêiner de serviço, você só precisa security.context
.Eu suponho que você já tenha estendido a UserRepository
assim, você pode substituir o createFilterPaginator()
método e que ele está corretamente configurado como o sylius.repository.user
serviço.
Você precisa adicionar um simples setter para o seu respository:
class UserRepository extends BaseUserRepository
{
protected $user;
public setUserViaSecurityContext(SecurityContextInterface $securityContext)
{
$this->user = $securityContext->getToken()->getUser();
}
}
Agora você tem que manipular a definição de serviço em um compilador passar
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'),
))
;
}
}
E chamar isso de passagem de Compilador em seus pacotes do arquivo:
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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow