Как Doctrine вызывает функцию, которая не существует?

Я пытаюсь выяснить, почему поле не сохраняется. Он передается нормально, и страница перезагружается с тем же значением, но не сохраняется в базе данных. У меня есть это в моем проекте

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

Тем не менее Save() функция не существует в классе Contact и ничего не расширяет! Как это может вызвать функцию, которая не существует? Я не верю, что в PHP есть мартышки. Я знаю, что функция вызывается, потому что я добавил 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;
}

Это проект eDirectory, основанный на Symfony 2.8 и PHP 5.6.27.

-1

Решение

Как подсказывает Padam87 в комментариях, вы, кажется, смешиваете Doctrine 1 с Doctrine 2 синтаксисом. В Doctrine 1 используется шаблон Active Record, а в Doctrine 2 используется шаблон Data Mapper. Хорошее объяснение различий можно найти здесь: https://www.culttt.com/2014/06/18/whats-difference-active-record-data-mapper/

Доктрина 2 сущность будет никогда иметь save() или похожий метод. Для сохранения или извлечения сущностей вам придется использовать диспетчер сущностей. Если вы используете Symfony, менеджер сущностей может быть внедрен в качестве службы в ваши контроллеры или другие службы.

Прочитайте документы Доктрины на как работать с менеджером организации Узнать больше.

Кстати, все, что вы пытаетесь, вводя $_POST данные в вашу сущность — это очень плохая идея. Сначала вы должны обработать эти данные в вашем контроллере или каком-либо валидаторе и заполнять только объекты проверенным контентом. Кроме того, при использовании Symfony вы хотите получить данные POST через Request объект, который передается вашему действию, если вы ссылаетесь на него в подписи.

Вот заглушка для контроллера, который вводит менеджер сущностей как зависимость (вы также должны зарегистрировать его как контроллер в качестве службы в вашем комплекте). services.yml) и получает данные POST от Request объект:

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);
}

В Symfony, опять же, вы также можете внедрить экземпляр Symfony\Component\Validator\Validator\ValidatorInterface а также использовать компонент проверки Symfony.

0

Другие решения

Я узнал почему. Было два класса контактов, и 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() функция.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector