Greifen Sie auf den aktuell angemeldeten Benutzer im Benutzerrepository in Sylius zu

StackOverflow https://stackoverflow.com//questions/24012947

  •  21-12-2019
  •  | 
  •  

Frage

Ich würde gerne so etwas machen.

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]

Ich möchte auf service_container zugreifen in createFilterPaginator Methode.Kann mir jemand helfen, dieses Problem zu lösen?

War es hilfreich?

Lösung

Erstens brauchen Sie nicht den gesamten Servicecontainer, Sie brauchen nur security.context.Ich gehe davon aus, dass Sie die bereits verlängert haben UserRepository so können Sie die überschreiben createFilterPaginator() methode und es ist korrekt als die konfiguriert sylius.repository.user Service.

Sie müssen Ihrem Repository einen einfachen Setter hinzufügen:

class UserRepository extends BaseUserRepository
{
    protected $user;

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

Jetzt müssen Sie die Servicedefinition in einem Compilerdurchlauf bearbeiten

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'),
            ))
        ;
    }
}

Und rufen Sie diesen Compiler-Pass in Ihrer Bundle-Datei auf:

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());
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top