Accéder à l'utilisateur actuellement connecté dans UserRepository dans Sylius
Question
J'aimerais faire quelque chose comme ça.
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]
Je souhaite accéder à service_container dans createFilterPaginator
méthode.Quelqu'un peut-il m'aider à résoudre ce problème ?
La solution
Tout d’abord, pas besoin de tout le conteneur de services, il vous suffit security.context
.Je suppose que vous avez déjà prolongé le UserRepository
afin que vous puissiez écraser le createFilterPaginator()
méthode et il est correctement configuré comme sylius.repository.user
service.
Vous devez ajouter un simple setter à votre référentiel :
class UserRepository extends BaseUserRepository
{
protected $user;
public setUserViaSecurityContext(SecurityContextInterface $securityContext)
{
$this->user = $securityContext->getToken()->getUser();
}
}
Vous devez maintenant manipuler la définition du service lors d'une passe du compilateur.
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'),
))
;
}
}
Et appelez cette passe du compilateur dans votre fichier bundles :
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());
}
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow