我想做这样的事情。

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]

我想访问 service_container createFilterPaginator 方法。任何人都可以帮我解决这个问题吗?

有帮助吗?

解决方案

首先,不需要整个服务容器,只需要 security.context. 。我假设你已经延长了 UserRepository 这样你就可以覆盖 createFilterPaginator() 方法并且它被正确配置为 sylius.repository.user 服务。

您必须向存储库添加一个简单的设置器:

class UserRepository extends BaseUserRepository
{
    protected $user;

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

现在您必须在编译器过程中操作服务定义

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

并在您的捆绑文件中调用此编译器传递:

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());
    }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top