Php ';在链配置的命名空间';在职
我在Symfony中配置了一个服务:Php ';在链配置的命名空间';在职,php,symfony,doctrine-orm,Php,Symfony,Doctrine Orm,我在Symfony中配置了一个服务: v_bla_orm.listener.address: class: Bla\OrmBundle\EventListener\AddressManager calls: - [ setContainer, [ @service_container ] ] tags: - { name: doctrine.event_listener, event: preP
v_bla_orm.listener.address:
class: Bla\OrmBundle\EventListener\AddressManager
calls:
- [ setContainer, [ @service_container ] ]
tags:
- { name: doctrine.event_listener, event: prePersist }
- { name: doctrine.event_listener, event: preUpdate }
在单元测试中运行代码时,将发生以下异常:
在链配置的命名空间Bla\OrmBundle\Entity、iovor\GoogleMapBundle\Entity中找不到类“Bla\OrmBundle\EventListener\AddressManager”
在单步执行代码时,我确定异常发生在AddressManager
中的下一行:
$meta = $em->getClassMetadata(get_class($entity));
整个功能:
public function preUpdate(LifecycleEventArgs $args) {
$entity = $this->getLatLong($args);
$em = $args->getEntityManager();
$uow = $em->getUnitOfWork();
$meta = $em->getClassMetadata(get_class($entity));
$uow->recomputeSingleEntityChangeSet($meta, $entity);
}
我不明白的是为什么AddressManager
应该在名称空间链中?由于它不是一个实体,当逐步通过代码时,代码会进入地址管理器
我该如何解决这个问题
编辑
还添加了lotlong函数
public function getLatLong(LifecycleEventArgs $args) {
$entity = $args->getEntity();
if ($entity instanceof \Bla\OrmBundle\Entity\Address) {
$geocoder = $this->container->get('ivory_google_map.geocoder');
$string = $entity->getStreet() . ' ' . $entity->getStreetNumber() . ', ' . $entity->getCity() . ' ' . $entity->getCountry();
$response = $geocoder->geocode($string);
$results = $response->getResults();
$entity->setLatitude(null);
$entity->setLongitude(null);
foreach ($results as $result) {
$location = $result->getGeometry()->getLocation();
$entity->setLatitude($location->getLatitude());
$entity->setLongitude($location->getLongitude());
return $entity;
}
}
}
如果您的getLatLong
不是\Bla\OrmBundle\entity\Address
的实例,则它不会返回实体,这意味着它本质上是返回null
这意味着当您稍后打电话时
$meta = $em->getClassMetadata(get_class($entity));
。。它真的在召唤
$meta = $em->getClassMetadata(get_class($entity));
$meta=$em->getClassMetadata(get_类(null))
。。这意味着它将返回调用它的类的名称,在本例中为Bla\OrmBundle\EventListener\AddressManager
排序的方法有很多,但最简单的是
public function preUpdate(LifecycleEventArgs $args) {
if (null === $entity = $this->getLatLong($args)) {
return;
}
$em = $args->getEntityManager();
....
}
你能展示你的getLatLong()
方法吗?@Qoop也添加了这个函数哦!太明显了!谢谢