Ответы пользователя по тегу Doctrine ORM
  • Как лучше организовать генерацию id для entity при работе с doctrine?

    27cm
    @27cm
    TODO: Написать статус
    $user = new User();
    $em->persist($user);
    $em->flush($user);
    $user->getId();
    Ответ написан
    Комментировать
  • Как правильно порождать объекты?

    27cm
    @27cm
    TODO: Написать статус
    1. Норм.
    2. Норм.
    3. Плохо, транспорт не должен создавать колёса.

    Вопрос - как логичней это делать? Учитывая то, что в сущности Wheel по-умолчанию нужно установить нек-рые параметры, к-рые зависят от параметров родителя, т.е. сущности Transport.


    Сперва создаёте колесо (через new или через фабрику, как удобнее) и настраиваете параметры, не зависящие от транспорта:
    $wheel = new Wheel();

    Затем добавляете колесо к транспорту:
    $transport->addWheel($wheel);

    Параметры Wheel, которые зависят от Transport, определяются в методе Transport::addWheel() или Wheel::setTransport():
    public function addWheel(Wheel $wheel)
    {
        $wheel->setTransport($this);
        $this->getWheelsCollection()->add($wheel);
    }
    Ответ написан
    1 комментарий
  • EntityManager#remove() expects parameter 1 to be an entity object, array given. Как исправить?

    27cm
    @27cm
    TODO: Написать статус
    1. Почему не настроен маппинг свойства name для категории?
    $entity = $em->getRepository('WindowsBundle:Category')->find($id);
    
    // Чтобы вместо этого
    $query = $em->createQuery('SELECT c.name FROM WindowsBundle:Category c WHERE c.id=:id')
        ->setParameter('id',$id);
    $entity_name = $query->getResult();
    
    // ...писать просто
    $entity_name = $entity->getName();


    2. Вы получаете массив Product. Так и удаляйте все по одному:
    $entity_product=$em->getRepository('WindowsBundle:Product')->findBy(array('category'=>$entity_name));
    foreach ($entity_product as $product) {
        $em->remove($product);
    }
    $em->flush();
    Ответ написан
    1 комментарий
  • Как реализовать сложную логику проверки привилегий пользователя в Zend Framework 2?

    27cm
    @27cm
    TODO: Написать статус
    Zend\Permissions\Acl не предполагает использование базы данных (см. framework.zend.com/manual/current/en/modules/zend....).

    Получается из assertion-а к БД никак не обратиться?

    Можно было бы и там оставить, но тогда придётся отключить кеширование, да вот беда - BjyAuthorize такой возможности не предоставляет. Описать им проблему в issue не хотите?

    Надо делать запросы в каком-то другом месте?

    Если хотите оставить кеширование, то придётся делать в каком-то другом месте.

    Могут предложить "грязное" / временное решение проблемы, за которое мне будет стыдно, но всё же.
    Не хранить ObjectManager внутри IsUserDrunkAssertion, а получать его через статический метод другого класса:
    class IsUserDrunkAssertionFactory implements FactoryInterface
    {
        static protected $objectManager;
    
        public function createService(ServiceLocatorInterface $serviceLocator)
        {
            static::$objectManager = $serviceLocator->get('doctrine.entitymanager.orm_default');
            $assertion = new IsUserDrunkAssertion();
            return $assertion;
        }
    
        static public function getObjectManager()
        {
            return static::$objectManager;
        } 
    }
    
    class IsUserDrunkAssertion implements AssertionInterface
    {
        public function assert(Acl $acl, RoleInterface $role = null, ResourceInterface $resource = null, $privilege = null)
        {
            $objectManager = IsUserDrunkAssertionFactory::getObjectManager();
            $decision = // ... здесь бы запрос сделать
            return $decision;
        }
    }
    Ответ написан