use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Serializer\Normalizer\AbstractObjectNormalizer;
use Symfony\Component\Serializer\Normalizer\DenormalizerInterface;
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
class MyObjectDenormalizer implements DenormalizerInterface
{
private ObjectNormalizer $objectNormalizer;
private EntityManagerInterface $entityManager;
public function __construct(ObjectNormalizer $objectNormalizer, EntityManagerInterface $entityManager)
{
$this->objectNormalizer = $objectNormalizer;
$this->entityManager = $entityManager;
}
public function denormalize($data, string $type, string $format = null, array $context = [])
{
if ($id = $data['id'] ?? null) {
$object = $this->entityManager->getRepository($type)->find($id);
$context = [
AbstractObjectNormalizer::OBJECT_TO_POPULATE => $object,
];
unset($data['id']);
}
return $this->objectNormalizer->denormalize($data, $type, $format, $context);
}
public function supportsDenormalization($data, string $type, string $format = null)
{
return $this->objectNormalizer->supportsDenormalization($data, $type, $format);
}
}
/comment/{id}/edit
), т.к. есть возможность подменить id и отредактировать другую сущность (к которой, к примеру, у пользователя доступа нет) ObjectNormalizer
или GetSetMethodNormalizer
, раз решили через сеттеры/геттеры с сущностями работать$obj = $this->normalizer->denormalize($data, YourEntity::class);
<?php
namespace App\DTO;
class PostDTO
{
/** @var string */
private $name;
/** @var string */
private $description;
/** @var string */
private $text;
public function __construct(string $name, string $description, string $text)
{
$this->name = $name;
$this->description = $description;
$this->text = $text;
}
public function getName()
{
return $this->name;
}
public function getDescription()
{
return $this->description;
}
public function getText()
{
return $this->text;
}
}
$query = $em->createQuery('SELECT NEW App\DTO\PostDTO(p.name, p.description, p.text) FROM App\Entity\Post p');
$users = $query->getResult(); // array of PostDTO
interface CategoryRepositoryInterface
{
public function findOne($id);
public function findAll(): array;
public function save(CategoryInterface $category);
public function remove(CategoryInterface $category);
}
class CustomNameOfClass implements CategoryRepositoryInterface // ну тут имя лучше изменить
{
public function findOne($id){}; // тут тоже лучше иметь return type
public function findAll(){}: array;
public function save(CategoryInterface $category){}; // тут тоже лучше иметь return type
public function remove(CategoryInterface $category){}; // тут тоже лучше иметь return type
}
Получается, что ProductRepository зависит от других репозиториев (Category, ProductType, Image, File....).
Теперь главный вопрос - как собирать товар (или другую сущность) из разных кусков?
Как обрабатывать метод $productRepository->save($product), если разные куски товара сохраняются по-разному.
Как быть с масштабированием, если в будущем появится еще что-то?
Ubuntu 16.04 зависает сразу же после установки и виснет до тех пор, пока я не поставлю проприетарные драйвера от Nvidia через терминал. После этого система запускается и работает нормально, но я также получаю ошибку в системе после apt-get update, появляется окно - произошла ошибка в unity..., не заскринил к сожалению. Система работает нормально, больше ошибок не было, но ресайз окна в Google Chrome происходит не то что фризами, рывками! С Intel HD 4600 все было окей. Тиринга нет на NVidia.
Linux Mint 18.1 - то же зависание, что и у Ubuntu 16.04.2 (и почему я не удивлен?), когда ставишь последний проприетарный драйвер от Nvidia, все окей, за исключением дерганного перемещения окон. На LOR про это писали, там комментаторы сказали - сам дурак. Проблема есть и ее я подтверждаю. Тиринга нет, но работать с окнами из-за этого бага невозможно.
Ubuntu 16.04 Mate - я пробовал 17.04 Beta, думал в стабильной версии будет получше. Но нет. Система не зависает, но тиринг везде, в том числе и на драйверах от Nvidia.проблема состоит именно в графике (функционировании видеокарты Nvidia). Маловероятно, что на других дистрибутивах Linux всё будет прекрасно работать, если проблема состоит в драйверах.