Php 在持久化之前创建机器可读名称
在Symfony2/Doctrine项目中,我有一个名为Php 在持久化之前创建机器可读名称,php,symfony,doctrine-orm,Php,Symfony,Doctrine Orm,在Symfony2/Doctrine项目中,我有一个名为Developer的实体,特别包括以下字段: 1. firstName 2. lastName 3. machineName 用于创建开发人员项的表单仅显示firstName和lastName字段。我希望在用户创建开发人员项时,根据其他两个字段自动生成machineName 例如,John Doe会给John_Doe,Jérémy Arçouille会给jeremy_arcouille 所以我的问题是: 对于这种(相当常见的)情况,
Developer
的实体,特别包括以下字段:
1. firstName
2. lastName
3. machineName
用于创建开发人员项的表单仅显示firstName和lastName字段。我希望在用户创建开发人员项时,根据其他两个字段自动生成machineName
例如,John Doe
会给John_Doe
,Jérémy Arçouille
会给jeremy_arcouille
所以我的问题是:
谢谢你的帮助。好的,这是我目前的想法 我在MyBundle\Utils\MachinesNames.php中创建了一个类文件,其中包含一个由开发人员实体的类调用的方法:
// MyBundle\Utils\MachineNames.php
class MachinesNames
{
public static function createDeveloperName(array $nameArray)
{
// code goes here
return $machineName;
}
public static function createActivityName(array $nameArray)
{
// other stuff...
return $machineName;
}
}
// MyBundle\Entity\Developer.php
class Developer
{
public function setMachineName()
{
$nameArray = array(
'firstName' => $this->getFirstName(),
'lastName' => $this->getLastName(),
);
$machineName = MachineNames::createDeveloperName($nameArray);
$this->setName($machineName);
}
}
使用生命周期回调在prePersist上调用此函数
有什么评论吗?有更好的办法吗?您是如何做到这一点的?在这种情况下,您至少可以尝试两种方法
use Doctrine\Common\EventSubscriber;
use Doctrine\ORM\Events;
use Doctrine\ORM\Event\LifecycleEventArgs;
class MyEventListener implements EventSubscriber
{
public function __construct(/* ... */)
{
/* you can use other services here */
}
public function prePersist(LifecycleEventArgs $event)
{
$developer = $event->getEntity();
if (!($developer instanceof Developer) || $developer->hasMachineName()) {
return;
}
...
$developer->setMachineName(...);
}
public function getSubscribedEvents()
{
return array(Events::prePersist);
}
}
<service id="..." class="...">
<!-- <argument ... /> -->
<tag name="doctrine.event_subscriber" />
</service>
save(Developer$dev)
方法持久化开发人员。此方法应该与第一种方法中的MyEventListener的工作完全相同注:你不应该做任何复杂的操作,也不应该从你的实体中引用外部类。+1为了清楚地写出这个问题,你可以创建一个服务并将它注入到生命周期回调侦听器服务中?你可以使用php iconv:
iconv('UTF-8',ASCII//TRANSLIT',è')代码>非常感谢!关于你的观点#2,有什么资源/指南/教程可以让我参考吗?我这样问是因为适当的域/业务层的概念听起来很有趣,我想了解更多。再次感谢。