2016-11-03 1 views
1

Я ищу часы, чтобы найти решение этой проблемы, но не повезло.Недопустимый тип смещения в isset или пустой Doctrine clear

Возможно, это дубликат сообщения, но я не нашел его.

Итак, у меня есть проблемы в службы Symfony в, когда я называю диспетчер сущностей clear($entityname) метод, который я получил эту ошибку:

Warning: Illegal offset type in isset or empty. 

Я понятия не имею, почему это происходит.

Если я комментирую метод clear(), все работает нормально.

Сначала я называю ProductController

public function postProductAction(Request $request) 
{ 
    if($jsonData = $this->requestToArray($request)){ 
     $productHandler = $this->get("admin.product_handler"); 
     $insertNews = $productHandler->insert($jsonData); 
     if($insertNews === true) { 
      return $this->jsonResponse->setData(array(
      "status" => true, "msg" => MessageConstants::SUCCESS_SEND_DATA)); 
     } 
    } 
    $this->jsonResponse->setStatusCode(204); 
    return $this->jsonResponse->setData(
    array("status" => false, "msg" => MessageConstants::FAILED_RECEIVE_RESPONSE)); 
} 

Затем вызовите ProductHandler которые устанавливают новый продукт

$productRepo = new Products(); 
$productRepo->setCarmodels(json_encode($data['ModelId'])); 
$productRepo->setCategoryid($category); 
$productRepo->setDescription($data['Description']); 
$productRepo->setDiscount($data['Discount']); 
$productRepo->setDiscountprice($data['DiscountPrice']); 
$this->em->persist($productRepo); 
$this->em->flush($productRepo); 
$insertOther = $this->update($productRepo->getId(), $data); 
$this->em->clear($productRepo); 

insertAnotfer обновление вызов, потому что есть некоторые действия, которые требуют, чтобы получить идентификатор продукта, так что мне нужно сначала вставьте, затем обновите.

$product = $productRepo->find((int)$id); 
$product->setCarmodels(json_encode($data['ModelId'])); 
$product->setCategoryid($category); 
$product->setDescription($data['Description']); 
$product->setDiscount($data['Discount']); 
$product->setDiscountprice($data['DiscountPrice']); 

В обновлении я также называю четкий метод

$this->em->flush($product); 
$this->em->clear($product); 

И тогда я получаю эту ошибку. Я попытался удалить ясный метод из обновления, но не повезло. Ошибка не будет срабатывать, только если я установил метод clear() без сущности в функции вставки.

+0

Не могли бы вы изменить свой пост, и показать полный код и где проблема возникает. Покажите только код/​​файлы, в которых вы очищаете объект. Благодаря! –

ответ

1

EntityManager :: ясно метод принимает имя типа объекта, а не реальный экземпляр объекта:

\ Учение \ ORM \ EntityManager:

/** 
* Clears the EntityManager. All entities that are currently managed 
* by this EntityManager become detached. 
* 
* @param string|null $entityName if given, only entities of this type will get detached 
* 
* @return void 
*/ 
public function clear($entityName = null) 
{ 
    $this->unitOfWork->clear($entityName); 
} 

Похоже, что вам нужно, это отсоединение - правильный метод для отмежевывается экземпляр сущности от менеджера объекта:

http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/working-with-objects.html#detaching-entities

\ Doctrine \ ORM \ EntityManager:

/** 
* Detaches an entity from the EntityManager, causing a managed entity to 
* become detached. Unflushed changes made to the entity if any 
* (including removal of the entity), will not be synchronized to the database. 
* Entities which previously referenced the detached entity will continue to 
* reference it. 
* 
* @param object $entity The entity to detach. 
* 
* @return void 
* 
* @throws ORMInvalidArgumentException 
*/ 
public function detach($entity) 
{ 
    if (! is_object($entity)) { 
     throw ORMInvalidArgumentException::invalidObject('EntityManager#detach()' , $entity); 
    } 

    $this->unitOfWork->detach($entity); 
} 
0

Я не верю, что у вас должен быть параметр, заданный в рамках функций очистки или очистки.

Вы пробовали, как это (без лица в качестве параметра):

$this->em->flush(); 
$this->em->clear(); 

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

+0

Это работает только в том случае, если я удаляю очистку из метода обновления, и вызываете flush и clear, как вы предлагаете.Но проблема не решена, потому что мне тоже нужно иметь эти методы в обновлении. –