• Как сообщить EntityManager о сущности?

    BoShurik
    @BoShurik Куратор тега Symfony
    Symfony developer
    https://symfony.com/doc/current/components/seriali...

    Это можно обернуть в какой-нибудь кастомный нормалайзер
    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 и отредактировать другую сущность (к которой, к примеру, у пользователя доступа нет)
    Ответ написан
    1 комментарий
  • Гидрация сущности из запроса. Что использовать?

    Maksclub
    @Maksclub Куратор тега PHP
    maksfedorov.ru
    Используйте Symfony Serializer Component, а именно встроенные ObjectNormalizer или GetSetMethodNormalizer, раз решили через сеттеры/геттеры с сущностями работать

    $obj = $this->normalizer->denormalize($data, YourEntity::class);
    Ответ написан
    2 комментария
  • Как сделать динамический OneToMany в Doctrine?

    glaphire
    @glaphire
    PHP developer
    Это похоже на наследование таблиц (inheritance mapping), но могут быть издержки с поддержанием такого решения (с чужих слов)
    Ответ написан
    Комментировать
  • Что делать, если нужно получить часть данных сущности?

    Maksclub
    @Maksclub Куратор тега PHP
    maksfedorov.ru
    Для отображения используйте DTO и доставайте их из репозитория. Для логики отображения негоже сущности из бизнес-слоя вытягивать.

    1 способ — заюзать Доктрину
    сразу не увидел, что вы без нее работаете

    Доктрина умеет создавать дтошки из коробки
    class PostDTO
    <?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;
        }
    }

    И используя синтаксис NEW DQL создаем наши DTO :
    $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

    Источник: https://www.doctrine-project.org/projects/doctrine...

    2 способ — заюзать DBAL/PDO
    Сделать запросы через более низкую прослойку без ORM (например через Doctrine DBAL или PDO) и результат фетчить в те же самые PostDTO в репе
    Ответ написан
    2 комментария
  • Laravel без фасадов. Как использовать?

    JhaoDa
    @JhaoDa
    LaravelRUS Team
    По итогу уточнений в каментах выяснилось, что билдер получался из контейнера не так. Надо:
    use Illuminate\Database\ConnectionInterface;
    
    public function __construct(ConnectionInterface $conn)
    {
        $conn->query()->from(...)->insert();
        // или $conn->table(...)->insert();
    }
    Ответ написан
    2 комментария
  • Легаси-монстр. Как побеждаете?

    @RidgeA
    Немного банальностей:
    1. Бизнес не даст ресурсов на переписывание проекта с 0: время и большие риски
    2. Бизнесу как правило все-равно какое говно там крутится, лишь бы деньги приносило.
    3. Если более-менее адекватное руководство - нужно донести идею постепенного рефакторинга кода по мере необходимости в процессе фикса багов и разработки новых фич и тем самым аргументировать что на разработку новых фич/фикс багов нужно больше времени.

    Как я бы делал:
    1. Тесты на существующие функции (если возможно, видел методы в контроллерах с мешаниной вызовов методов моделей, созданием DTO и сохранением их через репозиторий, прямых http-запросов и запросов в бд на 1000+ строк, покрыть такое тестами - невозможно)
    2. Составить план рефакторинга, где отметить что и где надо сделать, коротко, в основном для команды разработчиков.
    3. Постепенно рефакторить старый код по мере взаимодействия с ним.
    4. Новый код - писать сразу правильно, для взаимодействия со старым кодом где нет возможности/времени его переделать - делать какие-то адаптеры, что бы не распространять токсичный код.
    5. Как оперативная мера защиты от SQL иньекций можно поставить что-то вроде этого https://github.com/nbs-system/naxsi
    6. Мониторинг кода, который не используется - pinba.org , по мере обнаружения такого кода - удалять безвозвратно (в крайнем случае есть VCS, я надеюсь). Начать с более высокоуровнего кода - контроллеры, напримерю. Плюс IDE в этом могут помочь и grep.
    7. Как вариант - новые фичи можно пилить в отдельном проекте (v2), крутить оба и постепенно переходить на новый, со временем старый (v1) выкинуть (и начать делать новый - v3 :-) )
    Ответ написан
    3 комментария
  • Взаимодействие нескольких репозиториев. Как объединить?

    @nicandr
    Максим Федоров правильно вам написал, вам нужен еще один слой который будет взаимодействовать с вашими репозиториями, в симфони как и в лбдом другом фреимворке вся логика должна быть в сервисе. Из вашего описания вы сделали facade паттерн чтобы в клиентском коде все бьло просто. Для этого подойдет сервис, который может который так же модет наследовать(implement) интерфейс.

    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
    }

    Так будет тоже самое что и сейчас у вас, только репозитории работают отдельно, и сервис слой их обьеденяет с вашей логикой. Репозитории не должны знать о существовании других репозиториев.
    Поскльку у вас несколько репозиториев, создайте DTO и все данные после того как они преобразованы киньте в DTO, так у вас бьудет один стандартный обьект, над которым вы сможете выполнять дальнейшую логику.
    Ответ написан
    Комментировать
  • Взаимодействие нескольких репозиториев. Как объединить?

    SamDark
    @SamDark
    Yii2 core team
    Получается, что ProductRepository зависит от других репозиториев (Category, ProductType, Image, File....).


    Это уж как сделаете. Может зависеть, а может и нет. Я бы не завязывал одно на другое. Пусть там будет похожий код... ничего страшного.

    Теперь главный вопрос - как собирать товар (или другую сущность) из разных кусков?


    Руками.

    Как обрабатывать метод $productRepository->save($product), если разные куски товара сохраняются по-разному.


    Индивидуально. Руками.

    Как быть с масштабированием, если в будущем появится еще что-то?


    Или взять ORM или, опять же, руками. Не бойтесь писать код и не бойтесь его дублирования в разумных пределах. Не всё то DRY что им кажется.
    Ответ написан
    7 комментариев
  • В чем недостатки Java для веб-разработки?

    trerums
    @trerums
    Популярность PHP, Ruby и Python для веб-разработки на данный момент объясняется двумя факторами: популярность веб как такового и низкий порог вхождения в программирование. Ничто из вышеперечисленного не лучше и не хуже для веб-разработки чем Java или C#. Любою задачу можно решить и там и там с приблизительно одинаковым уровнем скорости, комфорта для разработчика и всего остального. Извините, что не дал конкретного ответа на ваш вопрос. Все имхо.
    Ответ написан
    1 комментарий
  • Это заказчики такие скупые пошли или я чего-то не понимаю?

    @InoMono
    1. В низшем квалификационном сегменте конкуренция жесткая. Многие готовы работать и за плошку риса
    2. Кто вам мешает предложить свою альтернативную цену. Сопроводив, разумеется, техническим планом работ, чтобы это не выглядело просто как тупая издевка с вашей стороны. Я так делал. И в 3-5 раз цену назначал. И тут же получал предложение.
    Ответ написан
    Комментировать
  • Как устроена авторизация по паролю в web-приложениях?

    @Vasiliy_M
    Достали советчики, постоянно толкающие слово "сессия" в контексте вопросов об авторизации/аутентификации.
    И то и другое вполне возможно можно реализовать без сессий.
    Сессии вообще для другого придуманы.
    Ответ написан
  • Живой веб-фреймворк на Java?

    leahch
    @leahch
    3D специалист. Dолго, Dорого, Dерьмово.
    Да, есть, более того, их куча! Я вот полюбил jooby.org , есть еще sparkjava.com и еще с десяток менее известных, не считая spring-boot.

    Это микрофреймворки с кучей модулей, в том числе и с ORM и с MVC. Ну а шаблонизатор любой (почти) на выбор из десятка - я использую Peeble (почти аналог питоновского jinja2), правда к нему кое чего дописывать пришлось (благо это просто), чтобы он был как jinja2. Как нибудь оформлю в отдельную библиотеку, когда наберется достаточно. Ну или здесь вопросы публикуйте.

    По jooby - очень активно развивается, куча модулей, очень прост и функционален, можно программировать в декларативном стиле java8 с лямбдами, можно и классами MVC, можно простые приложения, можно оооочень большие... Из коробки может простой DI через guava, кеши, ормы, парсеры, шаблонизаторы, сессии и даже pac4j.

    PS. Сейчас как раз переводим документацию по Jooby, если интересно, здесь - https://github.com/k1ll1n/Translate-Jooby-Docs
    По окончании будет на основном сайте.
    Ответ написан
    1 комментарий
  • Какую видеокарту выбрать для Ubuntu?

    fdroid
    @fdroid
    press any key
    GT710 работает с 16.04 нормально.
    Ответ написан
    2 комментария
  • Какую видеокарту выбрать для Ubuntu?

    CityCat4
    @CityCat4
    //COPY01 EXEC PGM=IEBGENER
    Если приобретается NVidia, то можно натолкнуться на такой косяк:
    Если в компе есть интеграха, то при установке NVidia и использовании коммерческих дров с модулем nvidia не будет консоли. То есть будет только графический интерфейс, при нажатии Ctrl-Alt-1 (например) увидите пустой экран с надписями ранней загрузки ядра.
    Если Вам все равно консоль не нужна - берите NVidia, коммерческие дрова потянут любую карту.
    Если консоль нужна - смотрите на поддержку карты дровами nouveau
    Ответ написан
    2 комментария
  • Какую видеокарту выбрать для Ubuntu?

    @Fixid Куратор тега Linux
    На 16.04 завелась GT210, два моника
    Ответ написан
    2 комментария
  • Куда переходить с Ubuntu 14.04?

    2ord
    @2ord
    В целом, компания NVidia повёрнута к сообществу Linux задом. Разработчикам альтернативных свободных драйверов приходится изгаляться для того, чтобы драйвера работали более-менее достойно.
    https://askubuntu.com/questions/751888/3-monitors-...

    Возможно, в новой версии Убунту, при более новом ядре, драйвера работают хуже. Это может быть следствием недружелюбности разработчиков NVidia к Linux. Однако, пользователю обычно наплевать на политику, поскольку он хочет чтобы всё просто работало.

    Согласно этим цитатам fman2:
    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 всё будет прекрасно работать, если проблема состоит в драйверах.

    Можно попробовать установить проприетарные драйвера так: https://askubuntu.com/questions/716668/geforce-gtx...

    Если не получится, то выбор может состоять либо в переходе на Windows (в силу проприетарности ОС и входящих в неё драйверов), либо в покупке подходящей для пользователя видеокарты, которая при этом совместима к Linux.
    Ответ написан
    1 комментарий
  • Как правильно сделать свой сервер GIT?

    @RidgeA
    https://about.gitlab.com/ + gitlab ci + если надо docker
    Ищите как настроить, это обширная тема и немало материала по ней
    Ответ написан
    1 комментарий
  • Как правильно сделать свой сервер GIT?

    1. Создать на сервере bare-репозиторий;
    2. Добавить в рабочие копии разработчиков новый remote на этот сервер;
    3. В bare-репозитории добавить хук (я использую update), в котором сделать чекаут нужной ветки в нужный каталог;
    4. Запустить при необходимости тесты
    Ответ написан
    Комментировать
  • Как правильно сделать свой сервер GIT?

    @miksir
    IT
    1. git сервер, можно взять saas решения (гитхаб, гитлаб и т.п.) или сделать свой (самое простое - просто ssh доступ к серверу и сделанный там git init --bare)
    2. git clone на dev сервере
    3. Хук post-receive на git сервере, который сходит по ssh на dev сервер и сделает там git pull. В случае гитхаб и т.п. - смотреть их вебхуки и т.п. - и по их вызову уже делать git pull). Конечно, всякие миграции и прочее придется исполнять руками. Или брать системы деплоя уже и использовать их.
    Ответ написан
    Комментировать