在Symfony 4事件下降和错误上键入实体

时间:2018-08-19 20:34:43

标签: symfony4

我的活动:

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”:的参数“ $ album”   方法“ __construct()”引用类“ 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 :(得分:1)

我认为您无需按照默认的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 :(得分:0)

解决方案不包括事件名称空间:

services:

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

或者只是添加您需要的内容:

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