我的活动:
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 }
答案 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}'