2016-01-19 3 views
0

Я следую за доктриной ORM Symfony2 Documentation. Когда дело доходит до Упорно объектов в базу данных я получаю эту ошибку:Symfony2 инъекционная сущностьManager error

Attempted to call an undefined method named "getDoctrine" of class "BooksApi\BookBundle\Controller\IndexController". 

Единственное, что я делаю по-другому в моем коде, что я пытаюсь создать EntityManager как сервис ....

services.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<container xmlns="http://symfony.com/schema/dic/services" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd"> 
    <services> 
     <service id="booksapi.controller.index" 
       class="BooksApi\BookBundle\Controller\IndexController"> 
      <argument type="service" id="booksapi.repositories.test_repository" /> 
      <argument type="service" id="doctrine.orm.entity_manager" /> 
     </service> 
    </services> 
</container> 

мой индекс контроллера:

<?php 

namespace BooksApi\BookBundle\Controller; 

use BooksApi\BookBundle\Entity\BooksEntity; 
use Doctrine\ORM\EntityManager; 
use Symfony\Component\HttpFoundation\Response; 


class IndexController 
{ 
    /** 
    * @var EntityManager 
    */ 
    public $em; 

    /** 
    * @param EntityManager $entityManager 
    */ 
    public function __construct(
     EntityManager $entityManager 
    ){ 
     $this->em = $entityManager; 
    } 

    /** 
    * @return Response 
    */ 
    public function testAction() 
    { 

     $book = new BooksEntity(); 
     $book->setTitle('Tomazi in da Jungle'); 
     $book->setPrice('19.99'); 
     $book->setDescription('Lorem ipsum dolor'); 

     $this->em = $this->getDoctrine()->getManager(); 

     $this->em->persist($book); 
     $this->em->flush(); 

     return new Response('Created product id '.$book->getId()); 
    } 
} 

Так, глядя на е Метод rror getDoctrine не распознается .... любая идея, почему ...? Как это исправить.

+0

Вы не хватаете очевидные. $ this-> em устанавливается в вашем конструкторе, поэтому удалите $ this-> em = $ this-> getDoctrine() -> getManager(); и все будет хорошо. – Cerad

ответ

3

1/Быстрое решение:

Удалить эту строку: $this->em = $this->getDoctrine()->getManager();

2/Лучшим решение:

IndexController должен распространяться Controller

(Symfony\Bundle\FrameworkBundle\Controller\Controller)

И getDoctrine метода может быть доступным. Таким образом, Doctrine Entity Manager не нужно вводить. Нет конструктора, нет определения службы.

+0

Есть ли какой-либо способ, чем расширение контроллера ...? – John

+0

---> _Удалить эту строку_: '$ this-> em = $ this-> getDoctrine() -> getManager();' <--- – Federkun

+0

Да, как и вы: внедренный администратор сущности Doctrine. Итак, используйте первый вариант, который я предлагаю. – scoolnico

3

Определение вашего контроллера - хорошая практика, поэтому я буду придерживаться этого. Две вещи здесь, кажется, не так:

  1. Ваше определение услуг (services.xml) содержит два параметра и ваш конструктор контроллер принимает только один аргумент.

  2. Эта линия: $this->em = $this->getDoctrine()->getManager();: вам не нужно вообще, так как ваш $this->em уже определен в конструкторе и его значение является EntityManager экземпляр. Просто удалите эту строку, и вы должны быть хорошо

И причина вы получите эту ошибку только потому, что вы пытаетесь использовать getDoctrine метод, который является Controller метода. Что это does просто прошу Container создать экземпляр EntityManager и поскольку у вас есть этот экземпляр уже впрыскивается в constructor этот вызов (getDoctrine) не требуются при всех

+0

Отлично работает. Спасибо за ответ. К сожалению, Scoolnico ответил первым, поэтому согласится с его ответом, но и проголосовал за вас. – John

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