我正试图找出为什么不保存字段。它已提交,并且页面以相同的值重新加载,但未存储在数据库中。我的项目中有这个
$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项目。
答案 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()
函数。