首页 文章

在Symfony 4事件上键入实体丢失和错误

提问于
浏览
0

我的活动:

namespace App\Event;

use Symfony\Component\EventDispatcher\Event;
use App\Entity\Album;

class AlbumEvent extends Event
{

protected $album;

public function __construct(Album $album)
{
    $this->album = $album;
}

错误:

无法自动装配服务“App \ Event \ AlbumEvent”:方法“__construct()”的参数“$ album”引用类“App \ Entity \ Album”但不存在此类服务 .

实体实际存在:

namespace App\Entity;
class Album
{

我的配置(一切都设置为true,因为我不知道它是否可以干扰):

services:
   _defaults:
        autowire: true
        autoconfigure: true
        public: true

并且监听者调度事件:

namespace App\EventListener;

use Doctrine\ORM\Event\LifecycleEventArgs;
use App\Entity\Album;
use App\Event\AlbumEvent;
use App\Event\AlbumEvents;

class OrmListener {

public function __construct($ed) {
    $this->ed = $ed;
}


public function preRemove(LifecycleEventArgs $args) {
    $e = $args->getEntity();

    if ($e instanceof Album) {
        $ev2 = new AlbumEvent($e);
        $this->ed->dispatch(AlbumEvents::PREREMOVE, $ev2);
        return;
    }
 }
}

两个听众配置:

album_listener:
    class: App\EventListener\AlbumListener
    arguments: [ '@doctrine.orm.entity_manager']

    tags:
       - { name: kernel.event_listener, event: album.preremove, method: preremove}


    orm.listener:
    class: App\EventListener\OrmListener
    arguments: ['@event_dispatcher']
    tags:
        - { name: doctrine.event_listener, event: preUpdate, method: preUpdate }
        - { name: doctrine.event_listener, event: postUpdate, method: postUpdate }
        - { name: doctrine.event_listener, event: prePersist, method: prePersist }
        - { name: doctrine.event_listener, event: postPersist, method: postPersist }
        - { name: doctrine.event_listener, event: postRemove, method: postRemove }
        - { name: doctrine.event_listener, event: preRemove, method: preRemove }

2 回答

  • 0

    根据默认的config / services.yaml(参见here)的建议,我认为您不需要自动装配您的实体:

    services:
        # default configuration for services in *this* file
        _defaults:
            autowire: true      # Automatically injects dependencies in your services.
            autoconfigure: true # Automatically registers your services as commands, event subscribers, etc.
            public: false       # Allows optimizing the container by removing unused services; this also means
                                # fetching services directly from the container via $container->get() won't work.
                                # The best practice is to be explicit about your dependencies anyway.
    
        # makes classes in src/ available to be used as services
        # this creates a service per class whose id is the fully-qualified class name
        App\:
            resource: '../src/*'
            exclude: '../src/{Entity,Migrations,Tests,Kernel.php}'
    

    作为旁注,还要在此文件的_defaults部分中设置 public: false 以获得最佳实践 .

  • 1

    解决方案是排除Event命名空间:

    services:
    
    App\:
        resource: '../src/*'
        exclude: '../src/{Entity,Event,Migrations,Tests,Kernel.php}'
    

    或者只是添加你需要的东西:

    App\:
        resource: '../src/{EventListener, Service}'
    

相关问题