Doctrine如何称呼一个不存在的函数



我正试图找出字段不保存的原因。它提交得很好,页面会以相同的值重新加载,但它不会存储在数据库中。我在我的项目中有这个

$contact = new Contact($_POST);
$contact->Save();

但是,Contact类中不存在Save()函数,它也没有扩展任何内容!它如何能够调用一个不存在的函数?我不相信PHP有猴痘。我知道函数被调用是因为我在它的正上方添加了print_r($_POST)

<?php
namespace ArcaSolutionsCoreBundleEntity;
use DoctrineORMMapping as ORM;
/**
* Contact
*
* @ORMTable(name="Contact")
* @ORMEntity(repositoryClass="ArcaSolutionsCoreBundleRepositoryContactRepository")
* @ORMHasLifecycleCallbacks
*/
class Contact
{

我的新字段被定义为

/**
* @var string
*
* @ORMColumn(name="timezone", type="string", length=50, nullable=true)
*/
private $timezone;
/**
* Set timezone
*
* @param string $timezone
* @return Contact
*/
public function setTimezone($timezone)
{
$this->timezone = $timezone;
return $this;
}
/**
* Get timezone
*
* @return string
*/
public function getTimezone()
{
return $this->timezone;
}

这是一个基于Symfony 2.8和PHP 5.6.27的eDirectory项目。

正如Padam87在评论中所建议的,您似乎将条令1和条令2语法混合在一起。条令1使用活动记录模式,而条令2使用数据映射器模式。对差异的一个很好的解释可以在这里找到:https://www.culttt.com/2014/06/18/whats-difference-active-record-data-mapper/

条令2实体永远不会有save()或类似方法。要持久化或检索实体,必须使用实体管理器。如果使用Symfony,实体管理器可以作为服务注入控制器或其他服务。

阅读有关如何与实体经理合作的条令文档,了解更多信息。

顺便说一句,无论您尝试将$_POST数据注入实体,这都是一个非常糟糕的主意。您应该首先在控制器或某个验证器中处理这些数据,并且只使用经过验证的内容填充实体。此外,当使用Symfony时,您将希望通过Request对象获得POST数据,如果您在签名中引用该对象,则该对象将传递给您的操作。

这是一个控制器的存根,它将实体管理器作为依赖项注入(您还应该将其作为捆绑包的services.yml中的服务注册为控制器(,并从Request对象获取POST数据:

use SymfonyComponentHttpFoundationRequest;
use SymfonyComponentHttpFoundationResponse;
use DoctrineORMEntityManagerInterface;
private $entityManager;
public function __construct(EntityManagerInterface $entityManager)
{
$this->entityManager = $entityManager;
}
public function someAction(Request $request)
{
$data = $request->request->all();
// validate $data!!!
$contact = new Contact();
$contact->setSomeValue($data["value"]);
$this->entityManager->persist($contact);
$this->entityManager->flush();
return new Response("Ok", 200);
}

同样,在Symfony中,您还可以注入SymfonyComponentValidatorValidatorValidatorInterface的实例并使用Symfony的验证组件。

我发现了原因。有两个Contact类,eDirectory正在使用edirectorywebclassesclass_Contact.php中的那个。我发现的另一个是edirectorysrcArcaSolutionsCoreBundleEntityContact.php。它真正使用的是

class Contact extends Handle {
var $account_id;
...
function Save() {
$this->prepareToSave();
$dbObj = db_getDBObject(DEFAULT_DB,true);;
$sql  = "UPDATE Contact SET"
. " updated = NOW(),"
. " first_name = $this->first_name,"
...

因此,它确实具有Save()功能。

最新更新