2014-09-03 6 views
0

Мне нужно инициализировать сбор с помощью сущности самостоятельно. Я имею в виду, я могу сделать это на Java, например ниже: Я бы назвал метод из класса StatelesBean.Как правильно инициализировать ленивую коллекцию через сущность?

Итак, как я могу это сделать в php? Если кто-нибудь может написать образец кода, я буду признателен.

@Transient 
public void initialize(Collection collection, int levelCursor, int level) 
{ 
    if (collection instanceof PersistentBag) 
    { 
     if (ObjectUtil.isNull(((PersistentBag)collection).getSession())) 
      return; 
     else 
     { 
      Iterator itr = ((Collection)collection).iterator(); 
      while (itr.hasNext()) 
      { 
       if (levelCursor < level) 
        ((SuperEntity)itr.next()).initialize(levelCursor, level); 
       else 
        itr.next(); 
      } 
     } 
    } else 
    { 
     Iterator itr = ((Collection)collection).iterator(); 
     while (itr.hasNext()) 
     { 
      if (levelCursor < level) 
       ((SuperEntity)itr.next()).initialize(levelCursor, level); 
      else 
       itr.next(); 
     } 
    } 
} 

/** 
* Searches for column and join column annotations for getter methods. 
* If found then tries to initialize childs 
* @param levelCursor 
* @param level 
*/ 
@Transient 
public void initialize(int levelCursor, int level) 
{ 
    levelCursor++; 

    Method[] methods = this.getClass().getMethods(); 

    Object obj = null; 

    try 
    { 
     for (Method method : methods) 
     { 
      if (method.getAnnotation(JoinColumn.class) != null || method.getAnnotation(JoinTable.class) != null || method.getAnnotation(OneToMany.class) != null) 
      { 
       Object result = method.invoke(this, new Object[0]); 
       if (result == null) 
        continue; 

       if (result instanceof SuperEntity) 
       { 
        if (levelCursor < level) 
         ((SuperEntity)result).initialize(levelCursor, level); 
       } else if (result instanceof Collection) 
        initialize((Collection)result, levelCursor, level); 
      } 
     } 
    } 
    catch (Exception exc) 
    { 
     exc.printStackTrace(); 
    } 
} 
+0

Не могли бы вы объяснить немного больше, что вы пытаетесь сделать? Кстати, я не уверен, что пример Java здесь полезен. Некоторые PHP-контексты были бы более полезными. – lxg

+0

Предположим, что у нас есть объект User и ownCars arrayCollection. И fetchType LAZY, поэтому, когда я получаю запись пользовательской сущности, я могу захотеть достичь коллекции OwnCars. Я хочу их инициализировать, например user.initialize (1) {1 is deepLevel} или user.initialize (user.getOwnedCars()) – webyildirim

ответ

1

Итак, насколько я понимаю вашу задачу, вы хотите инициализировать объекты вашей коллекции сущностей при их восстановлении?

Doctrine загружает вашу коллекцию автоматически, когда вы ее вызываете.

Таким образом, вы можете сделать это с геттер:

class User 
    { 

     /** 
     * OneToMany(targetEntity="Car", mappedBy="owner") 
     */ 
     private $ownedCars; 

     public function __construct() 
     { 
      $this->ownedCars = new ArrayCollection(); 
     } 

     public function getOwnedCars($level) 
     { 
      // autoload collection 
      foreach($this->ownedCars as $ownedCar) 
      { 
       $ownedCar->initialize($level); 
      } 

      return $this->ownedCars; 
     } 
    } 
+0

Спасибо, и да, это подход, который разрешил ленивую инициализацию. Но на самом деле, я хочу решить это в смысле рефлексии, потому что я не хочу писать, что все объекты, которые имеют arrayCollection. Я предпочитаю универсальное решение, как я упомянул в своем вопросе, например, метод MappedSuperClass содержит отражение. – webyildirim

+0

Возможно ли реализовать в вашем целевом объекте метод магии [__wakeup()] (http://php.net/manual/en/language.oop5.magic.php#object.wakeup)? Он будет называться, когда доктрина десериализует объект. – Mischa

Смежные вопросы