Я использую Doctrine ODM и пытаюсь создать пользовательский тип отображения, но у меня возникли некоторые проблемы.Мой тип отображения аналогичен типу коллекции, но вместо этого он работает с ArrayCollection:
<?php
class ArrayCollectionType extends Type
{
public function convertToDatabaseValue($value)
{
return $value !== null ? array_values($value->toArray()) : null;
}
public function convertToPHPValue($value)
{
return $value !== null ? new ArrayCollection($value) : null;
}
public function closureToMongo()
{
return '$return = $value !== null ? array_values($value->toArray()) : null;';
}
public function closureToPHP()
{
return '$return = $value !== null ? new \Doctrine\Common\Collections\ArrayCollection($value) : null;';
}
}
Однако, когда я обновляю документ, он не записывает изменения из коллекции;начальное постоянное работает отлично.Я выполнил небольшую отладку, чтобы выяснить, что UnitOfWork (не) не вычисляет изменения.
Вот мой тестовый код: Документ:
<?php
namespace Application\Blog\Domain\Document;
use Cob\Stdlib\String,
Doctrine\Common\Collections\ArrayCollection;
/**
* Blog category
*
* @Document(repositoryClass="Application\Blog\Domain\Repository\BlogRepository", collection="blog")
*/
class Category
{
/**
* @Id
*/
private $id;
/**
* @Field(type="arraycollection")
*/
private $slugs;
public function __construct()
{
$this->slugs = new ArrayCollection();
}
public function getId()
{
return $this->id;
}
public function getSlugs()
{
return $this->slugs;
}
public function addSlug($slug)
{
$this->slugs->add($slug);
}
}
Служба:
<?php
$category = new Category("Test");
$category->addSlug("testing-slug");
$category->addSlug("another-test");
$this->dm->persist($category);
$this->dm->flush();
$this->dm->clear();
unset($category);
$category = $this->dm->getRepository("Application\Blog\Domain\Document\Category")->findOneBy(array("name" => "Test"));
$category->addSlug("is-it-working");
$this->dm->persist($category);
$this->dm->flush();
var_dump($category->getSlugs());
Ожидаемый результат:
object(Doctrine\Common\Collections\ArrayCollection)[237]
private '_elements' =>
array
0 => string 'testing-slug' (length=12)
1 => string 'another-test' (length=12)
2 => string 'is-it-working' (length=13)
Фактический результат
object(Doctrine\Common\Collections\ArrayCollection)[237]
private '_elements' =>
array
0 => string 'testing-slug' (length=12)
1 => string 'another-test' (length=12)