Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Symfony 3-Can和x27;t将令牌存储从订阅者传递到_Php_Symfony_Listener_Symfony 3.2 - Fatal编程技术网

Php Symfony 3-Can和x27;t将令牌存储从订阅者传递到

Php Symfony 3-Can和x27;t将令牌存储从订阅者传递到,php,symfony,listener,symfony-3.2,Php,Symfony,Listener,Symfony 3.2,我想在表单事件中获取当前登录用户,但由于某些原因,无法使其工作 我使用服务注入令牌存储并创建构造函数方法来获取令牌存储实例,但我在构造函数处得到了正确的错误: Type error: Argument 1 passed to AdminBundle\Form\EventListener\CompanyFieldSubscriber::__construct() must implement interface Symfony\Component\Security\Core\Authenticat

我想在表单事件中获取当前登录用户,但由于某些原因,无法使其工作

我使用服务注入令牌存储并创建构造函数方法来获取令牌存储实例,但我在构造函数处得到了正确的错误:

Type error: Argument 1 passed to AdminBundle\Form\EventListener\CompanyFieldSubscriber::__construct() must implement interface Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface, none given
我不确定问题出在哪里以及如何解决。有人知道问题出在哪里吗

编辑1:

我想我找到了问题所在,但我找不到“好”的解决方案。我以以下方式在表单类型中调用此事件:

->addEventSubscriber(new CompanyFieldSubscriber());
问题是我并没有使用“服务/依赖项注入”来创建事件,也并没有向构造函数发送任何内容。这就是为什么我会有这个错误(不是100%确定是hones)

由于我有大约20-30个表单,新表单将及时出现,因此我需要为每个需要用户(或令牌存储)实例的表单创建服务,并作为参数调用令牌存储或此事件订阅者作为服务参数

我知道,如果我将每个表单创建为服务,并将所需数据作为参数传递,那么它将起作用。但是,有没有一种方法可以“自动”处理这个过程,而不必为每个表单创建新的服务,因为表单事件中需要一些用户数据交互

编辑2:

正如建议的那样,我试图更改事件订阅者构造函数,但在不同的类名下出现了相同的错误

新代码:

use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage;

public function __construct(TokenStorage $tokenStorage)
    {
        $this->tokenStorage = $tokenStorage;
    }
新错误:

Type error: Argument 1 passed to AdminBundle\Form\EventListener\CompanyFieldSubscriber::__construct() must be an instance of Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage, none given
这是我正在使用的代码:

服务:

admin.form.event_listener.company:
    class:  AdminBundle\Form\EventListener\CompanyFieldSubscriber
    arguments: ['@security.token_storage']
    tags:
        - { name: form.event_listener }
事件侦听器:

namespace AdminBundle\Form\EventListener;

use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;

class CompanyFieldSubscriber implements EventSubscriberInterface
{
    private $tokenStorage;

    private $user;

    public function __construct(TokenStorageInterface $tokenStorage)
    {
        $this->tokenStorage = $tokenStorage;
        $this->user = $this->tokenStorage->getToken()->getUser();
    }

    public static function getSubscribedEvents()
    {
        return [
            FormEvents::PRE_SET_DATA => 'preSetData',
            FormEvents::PRE_SUBMIT => 'preSubmitData',

        ];
    }

    public function preSetData(FormEvent $event)
    {

        $form = $event->getForm();

        if (in_array("ROLE_SUPER_ADMIN", $this->user->getRoles())) {
            $form->add('company', EntityType::class, [
                'class' => 'AppBundle:Company',
                'choice_label' => 'name'
            ]);
        }
    }

    public function preSubmitData(FormEvent $event)
    {

        $form = $event->getForm();
        $bus = $form->getData();


        if (!in_array("ROLE_SUPER_ADMIN", $this->user->getRoles())) {
            $bus->setCompany($this->user->getCompany());

        }
    }
}

当您使用以下设备时,您以错误的方式呼叫用户:

new CompanyFieldSubscriber()
您不会将TokenStorageInterface传递给订阅服务器构造函数。将其称为服务,如果它位于控制器中,则:

->addEventSubscriber($this->get('admin.form.event_listener.company'));
如果它在窗体中,则从控制器传递到窗体

$this->get('admin.form.event_listener.company') 

作为选项,然后在表单中使用它

谢谢您的评论@Eimsas。我将尝试您的代码,但我不确定问题是否存在。我遵循symfony网站上的教程,他们注入当前登录用户的方式与我注入的方式相同,但他们是在表单类型中进行的。注入一切正常,您只是使用了错误的对象,您使用的是接口而不是令牌存储本身。我尝试了您的代码,相同的错误显示为不同的类名错误。我认为问题在于调用事件subrsivber。将更新我的原始问题以提供更多信息令牌存储没有问题读取错误:“必须实现接口Symfony\Component\Security\Core\Authentication\token\storage\TokenStorageInterface,未给出”在services.yml中注入Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage,在订阅服务器中使用Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage接口;也许您忘记将构造函数从TokenStorageInterface更改为TokenStorageI我使用了您提供的新代码,相同的错误会以不同的类名弹出。查看我更新的帖子。我想现在会更清楚。另外,谢谢你抽出时间。