Я пытаюсь выяснить, почему поле не сохраняется. Он передается нормально, и страница перезагружается с тем же значением, но не сохраняется в базе данных. У меня есть это в моем проекте
$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.
Как подсказывает 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.
Я узнал почему. Было два класса контактов, и 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()
функция.