2015-12-01 7 views
0

Помощи, В контроллере я обычно $this->getDoctrine()->getManager()->getRepository('ArtelProfileBundle:Teams') ->find($id)Symfony Доктрина, найти() возвращают прокси-сервера сущности

но имеет Proxies_CG_ \ ProfileBundle \ Entity \ Команда почему ?? Поскольку это метод PUT и я использую для нового и старого объекта, но новый объект, это почти объект Artel \ ProfileBundle \ Entity \ Teams и имеет разные значения с Proxies_CG_ \ Artel \ ProfileBundle \ Entity \ Teams

пример teamOld = Proxies_CG_ \ ProfileBundle \ Entity \ Команда teamNew = Артель \ ProfileBundle \ Entity \ Команда

стараюсь

 $qb = $this->getEntityManager()->createQueryBuilder('d'); 
    $qb 
     ->select('d') 
     ->from('ArtelProfileBundle:Teams', 'd') 
     ->andWhere('d.id = :id') 
     ->setParameter('id', $id) 

     ->getQuery() 
     ->getResult() 
    ; 
    $query = $qb->getQuery(); 
    $results = $query->getResult(); 
    return $results; 

, но до сих пор Proxies_CG_ \ Артель \ ProfileBundle \ Entity \ Команда Старается

$proxyObject->__load(); 

но только добавить информацию, но мне нужно юридическое лицо, чтобы быть артели \ ProfileBundle \ Entity \ Команды для моей службы UpdateObject

public function putTeamAction(Request $request, $id) 
    { 
    $teamOld = $this->getDoctrine()->getRepository('ArtelProfileBundle:Teams')->putTeamClient($id); 
    if (!empty($user) && !empty($token)) { 
     $data = $this->get('serializer')->serialize($data, 'json'); 

     $teamOld = $this->getDoctrine()->getManager()->getRepository('ArtelProfileBundle:Teams') 
      ->find($id); 

     $teamNew = $this->get('serializer') 
      ->deserialize($data, 'Artel\ProfileBundle\Entity\Teams', 'json'); 

      $this->get('artel.project.update')->updateObject($teamOld, $teamNew); 
      $this->getDoctrine()->getManager()->flush(); 
      return "Team successful update"; 
} 

, и я не понимаю, я точно PUT действия для другого проекта объекта. Почему доктрина возвращает другую сущность для одного объекта? для команды -> прокси, проект -> полностью объект проекта? и в этом действии у меня нет этой проблемы команды (доверенности)

<?php 
namespace Artel\ProfileBundle\Entity; 

use Doctrine\Common\Collections\ArrayCollection; 
use Doctrine\ORM\Mapping as ORM; 
use Symfony\Component\Validator\Constraints as Assert; 
use Gedmo\Mapping\Annotation as Gedmo; 
use FOS\ElasticaBundle\Configuration\Search; 

/** 
* Teams 
* 
* @ORM\Table(name="teams") 
* @Gedmo\SoftDeleteable(fieldName="deletedAt") 
* @ORM\Entity(repositoryClass="Artel\ProfileBundle\Entity\Repository\TeamsRepository") 
* @Search(repositoryClass="Artel\ProfileBundle\Entity\Repository\ArticleRepository") 
*/ 

class Teams 
{ 
/** 
* @var integer 
* 
* @ORM\Column(name="id", type="integer") 
* @ORM\Id 
* @ORM\GeneratedValue(strategy="AUTO") 
*/ 
protected $id; 

проекта (полностью объектный)

<?php 
namespace Artel\ProfileBundle\Entity; 

use Doctrine\ORM\Mapping as ORM, 
    Gedmo\Mapping\Annotation as Gedmo, 
    Symfony\Component\Validator\Constraints as Assert; 
use Artel\ProfileBundle\Helper\HelperMethod; 
use JMS\Serializer\Annotation\ExclusionPolicy; 
use JMS\Serializer\Annotation\Expose; 
use JMS\Serializer\Annotation\Type; 
/** 
    * Project 
    * 
    * @ORM\Table(name="project") 
    * @Gedmo\SoftDeleteable(fieldName="deletedAt") 
    * @ORM\Entity(repositoryClass="Artel\ProfileBundle\Entity\Repository ProjectRepository") 
    * @ExclusionPolicy("all") 
    */ 
class Project 
{ 
/** 
* @var integer 
* 
* @ORM\Column(name="id", type="integer") 
* @ORM\Id 
* @Expose() 
* @ORM\GeneratedValue(strategy="AUTO") 
*/ 
private $id; 

Чем отличается o_0?

public function updateObject($objectOld, $objectNew) 
{ 
    if (get_class($objectOld) != get_class($objectNew)) { 
     throw new \Exception('class not equals'); 
    } 

    $accessor = new PropertyAccessor(); 

    $reflect = new \ReflectionClass($objectOld); 
    $properties = $reflect->getProperties(\ReflectionProperty::IS_PUBLIC | \ReflectionProperty::IS_PROTECTED | \ReflectionProperty::IS_PRIVATE); 

    foreach ($properties as $property) { 
     $propertyName = $property->getName(); 

     $newValue = $accessor->getValue($objectNew, $propertyName); 

     if ($newValue !== null) { 
      $accessor->setValue($objectOld, $propertyName, $newValue); 
     } 
    } 

    return $objectOld; 
} 

UPDATE MAGIC , когда я удалил $ идентификатора из паров и добавить в параметрах и в начале акции я findOneById я завершил юридическое лицо. Но когда я удалил в стартовом действии findOneById снова имеют прокси. И когда я использую для $ sampleOld findOneById, у меня все еще есть прокси. Только когда в стартовом действии $ team = $ this-> getDoctrine() -> getRepository ('ArtelProfileBundle: Teams') -> findOneById ($ team_id); Я завершил и после $ sampleOld = $ manager-> getRepository ('ArtelProfileBundle: Teams') -> find ($ team_id); завершено. Это волшебство.

public function putTeamAction(Request $request) 
{ 
    $team_id = $this->get('request')->request->get('id'); 
    $team = $this->getDoctrine()->getRepository('ArtelProfileBundle:Teams')->findOneById($team_id); 
    $manager = $this->getDoctrine()->getManager(); 
    $token = $this->get('request')->request->get('token'); 
    $user = $this->getDoctrine()->getRepository('ArtelProfileBundle:Users')->findOneBySecuritytoken($token); 

    $data = $request->request->all(); 
    $view = View::create(); 

    if (!empty($user) && !empty($token)) { 
     $data = $this->get('serializer')->serialize($data, 'json'); 

     $sampleOld = $manager->getRepository('ArtelProfileBundle:Teams') 
      ->find($team_id); 
     $sampleNew = $this->get('serializer') 
      ->deserialize($data, 'Artel\ProfileBundle\Entity\Teams', 'json'); 

     if (!$sampleOld) { 

      $manager->persist($sampleNew); 
      $manager->flush(); 
      $view = $this->view('Project successful create', 200); 
      return $this->handleView($view); 

     } else { 
      $this->get('artel.project.update')->updateObject($sampleOld, $sampleNew); 
      $manager->flush(); 

      $view = $this->view('Project successful update', 200); 
      return $this->handleView($view); 
     } 
    }else{ 
     $view = $this->view('Secret token is not valid', 101); 
     return $this->handleView($view); 
    } 
} 

ответ

1

но есть Proxies_CG_\ProfileBundle\Entity\Teams почему ??

Это нормальное поведение доктрины. Вы должны изменить свой метод updateObject. Я знаю, что он универсален, но имеет проблемы, когда вы пытаетесь обновить подклассы. Посмотрите на Memento pattern или реализовать update в классе сущностей $entity->updateFrom(Entity $entity);

+0

, но у меня есть некоторые сущность и PUT метод $ projectOld = $ Manager-> getRepository ('ArtelProfileBundle: Project') -> найти ($ ID); и имеют нормальный объект, а не прокси, что другое? –

+0

Почему доктрина возвращает другой объект для одного объекта? для команды -> прокси, проект -> полностью объект проекта –

+0

Я не уверен, но, возможно, потому, что ArtelProfileBundle: Project не имеет ассоциаций –

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