Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
class IntakeFilter
{
protected $user;
/**
* @RequestMapper(type="integer")
*/
protected $limit = 20;
/**
* @RequestMapper(type="integer")
*/
protected $offset = 0;
/**
* @RequestMapper(type="boolean")
*/
protected $isCompleted;
/**
* @RequestMapper(type="string")
* @Assert\Length(min=2)
*/
protected $query;
}
public function actionList()
{
$model = $this->handleRequest(new App\Model\IntakeFilter($this->getUser());
return $repository->findByFilter($model);
}
class SomeEntity {
public function getShortInfoView() {
// думаю эту штуку можно сократить для пущей читабельности.
// А если у нас будет много вьюшек, можно DRY-ить эти вещи
// или если дела будут совсем плохи, делать нормальные объекты DTO.
return [
'id' => $this->id,
'name' => $this->name,
'some_info' => $this->someInfo,
'connected_entities' => $this->connectedEntities->map(function (SomeConntectedEntity $entity) {
return $entity->getShortInfoView();
})->toArray();
];
}
}
class SomeController {
public function addSomeAction(Request $request) {
// обычно это происходит во фронт контроллере для всех запросов с Content-type application/json
// тут просто для наглядности
$dto = json_encode($request->getContent());
// у меня умерла под конец дня фантазия, так что простите за именования в духе some creator
$shortInfoView = $this->get('app.some_creator')->createSome($dto);
// это так же происходит во фронт контроллере но мне лень
// что до ситуация с ID и их получением до flush
// я использую postgresql и тамошние последовательности, которые прекрасно это дело разруливают
// а автоинкремент mysql это зло
$this->get('doctrine.orm.entity_manager')->flush();
// обычно из контроллера я возвращаю только данные или какой-то View объект в духе FostRest
return new JsonResponse($shortInfoView);
}
}
class SomeCreator
{
private $someRepository;
public function __construct(SomeRepository $repository) {
$this->someRepository = $repository;
}
public function create($dto) {
// тут можно провалидировать $dto но лень
// всеравто чуть что конструктор энтити бросит исключение
// ну и лучше что бы $dto был \stdObject.
// Тогда потом можно будет в случае усложнения логики
// переделать его на нормальный DTO объект со своим типом
$entity = new SomeEntity($dto['name'], $dto['short_info']);
$this->someRepository->add($entity);
return $entity->getShortInfoView();
}
}
$entity = new SomeEntity($dto['name'], $dto['short_info']);
$entity = new SomeEntity($dto['name'], $dto['some_info']);
/**
* @Common\Annotation\SerializationGroup("clinic_details")
* @Common\Annotation\HttpStatus(201)
*
* @Method("POST")
* @Route
*/
public function addAction()
{
$entity = $this->handleRequest(new Common\Entity\Clinic($this->getUser());
$this->persist($entity, true);
return $entity;
}
(ненавижу тупые сеттеры в сущностях)
JWT аутентификации,
JMSSerializer переусложнен и очень медленный. Даже опытные разработчики могли потерять часы, чтобы что-то подправить в API сгенерированном этим сервисом.
Если нужно сделать что-то сложное, например поиск, это вообще ад.
Джуниора вообще подпускать к этому бандлу нереально.
Но… java работает примерно от 10 до 200 раз быстрее.
Приведите, пожалуйста, конкретный пример. К слову, с такой же ситуацией я и сам недавно столкнулся, но количество времени, которое JMSSerializer сэкономил, ставит на нет некоторые недочеты и сложности.
До 200 раз? Приведите, пожалуйста, пример
Сделайте кастомную выгрузку коллекции, чтобы там было 3-4 связи и это было скажем на хотябы на 100K записей. А также выводились данные о пагинации.
Особенности разработки API на Symfony2