教义如何调用不存在的函数?

时间:2018-07-22 20:31:06

标签: php symfony doctrine arcasolutions-edirectory

我正试图找出为什么不保存字段。它已提交,并且页面以相同的值重新加载,但未存储在数据库中。我的项目中有这个

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

但是,Save()函数在Contact类中不存在,并且不扩展任何内容!如何调用不存在的函数?我不认为PHP具有Monkeypatching。我知道该函数被调用是因为我在其上方添加了print_r($_POST)

<?php

namespace ArcaSolutions\CoreBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Contact
 *
 * @ORM\Table(name="Contact")
 * @ORM\Entity(repositoryClass="ArcaSolutions\CoreBundle\Repository\ContactRepository")
 * @ORM\HasLifecycleCallbacks
 */
class Contact
{

我的新字段定义为

/**
 * @var string
 *
 * @ORM\Column(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项目。

2 个答案:

答案 0 :(得分:0)

正如Padam87在评论中所建议的那样,您似乎将教义1与教义2语法混合使用。原则1使用活动记录模式,而原则2使用数据映射器模式。可以在这里找到关于差异的很好的解释:this answer

主义2实体将从不使用> (looks-cool (make-instance 'too-stiff)) NIL > (looks-cool (make-instance 'scottish)) T > (looks-cool (make-instance 'also-good)) T > (looks-cool (make-instance 'too-crazy)) NIL 或类似方法。要保留或检索实体,您将必须使用实体管理器。如果您使用Symfony,则可以将实体管理器作为服务注入到控制器或其他服务中。

阅读https://www.culttt.com/2014/06/18/whats-difference-active-record-data-mapper/上的《 Doctrine》文档以了解更多信息。

顺便说一句,无论您通过将save()数据注入到您的实体中来尝试什么,这都是一个非常糟糕的主意。您应该首先在控制器或某些验证器中处理此数据,然后仅用已验证的内容填充实体。另外,在使用Symfony时,您将希望通过$_POST对象获取POST数据,如果您在签名中引用该数据,则该数据会传递给您的操作。

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

Request

再次在Symfony中,您还可以注入use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Doctrine\ORM\EntityManagerInterface; 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); } how to work with an entity manager的实例。

答案 1 :(得分:0)

我发现了原因。有两个Contact类,而eDirectory正在使用edirectory\web\classes\class_Contact.php中的一个。我找到的另一个在edirectory\src\ArcaSolutions\CoreBundle\Entity\Contact.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()函数。