2016-01-13 43 views
0

我正在爲Symfony 3編寫一個非常簡單的API用於學習目的。我正在嘗試涵蓋服務領域。Symfony創建Doctrine ORM服務

我有一個存儲庫,我想注入Doctrine ORM,這樣做我想在我的services.xml文件中創建Doctrine ORM服務。

的services.xml:

<service 
      id="orm.doctrine.service" 
      class="Book\BookBundle\DoctrineORM\DoctrineRepo"> 
     <argument type="service" id="doctrine.orm.entity_manager" /> 
    </service> 

    <service 
      id="book.repo.create_book_repository" 
      class="Book\BookBundle\Repositories\CreateBookRepository"> 
     <argument type="service" id="orm.doctrine.service" /> 
    </service> 

學說與作曲家安裝了供應商庫,因此我沒有爲它的一類在我的包。我反而試圖參考它。

DoctrineRepo:

<?php 

namespace Book\BookBundle\DoctrineORM; 

use Symfony\Bundle\FrameworkBundle\Controller\Controller; 

class DoctrineRepo extends Controller 
{ 

    private $db; 

    public function initDoctrine() 
    { 
     $this->db = $this->get('doctrine.orm.entity_manager'); 
     return $this->db; 
    } 

} 

CreateBookRepository:

<?php 

命名空間書\ BookBundle \庫;

使用Book \ BookBundle \ Entity \ BookEntity; 使用Book \ BookBundle \ DoctrineORM \ DoctrineRepo;

類CreateBookRepository {

private $db; 

public function __construct(
    DoctrineRepo $doctrineRepository 
) { 
    $this->db = $doctrineRepository; 
} 

public function createRepository() 
{ 

    $product = new BookEntity(); 
    $product->setTitle('Test Title'); 
    $product->setAuthor('Leps'); 
    $product->setReleaseDate(new \DateTime); 
    $product->setGender('Scfi'); 
    $product->setDescription('Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. 
     Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in 
     voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt 
     mollit anim id est laborum.'); 


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

    $em->persist($product); 
    $em->flush(); 

} 

}

什麼我這裏缺少或不理解......?

+0

是否有嘗試創建自己的原則,而不是使用DoctrineBundle服務具體原因是什麼? – xabbuh

回答

2

如果你需要注入特定服務的學說實體管理器,看看這個:

<service id="your_service" class="path_to_your_class_service"> 
    <argument type="service" id="doctrine.orm.entity_manager" /> 
</service> 
+0

抱歉,如果一直跛腳,但我不undrs這個,但class =「path_to_your_class_service」?因爲我想將此服務注入許多不同的存儲庫。 – John

+0

我想你的服務是一個包含方法和屬性的類。例如:MyDoctrineManager.php。它可以存儲在這種類型的路徑中:AppBundle \ Service。因此,你的服務定義中的attribut類應該看起來像:'class =「AppBundle \ Service \ MyDoctrineManager」' – scoolnico

+0

如果你有時間請看我的問題編輯請。 – John

1

首先,讓我們來配置我們的服務:

#../services.xml 

<service id="book.manager" class="Book\BookBundle\Manager\BookManager"> 
    <argument type="service" id="doctrine.orm.entity_manager" /> 
</service> 

其次,創建服務(BookManager)

namespace Book\BookBundle\Manager; 

use Doctrine\ORM\EntityManager; 
use Book\BookBundle\Entity\BookEntity; 

class BookManager 
{ 
    /** @var Entity Manager */ 
    protected $em; 

    /** 
    * Constructor 
    * 
    * @param \Doctrine\ORM\EntityManager $em 
    */ 
    public function __construct(EntityManager $em) 
    { 
     $this->em = $em; 
    } 


    public function createBook(BookEntity $book) 
    { 
     /... a specific logic if you need .../ 

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

完成後,在需要的地方打電話給您的服務(例如在控制器)

public function yourSpecificAction() 
{ 
    // We instanciate a new object 

    $book = new BookEntity(); 
    $book->setTitle('Test Title'); 
    $book->setAuthor('Leps'); 
    $book->setReleaseDate(new \DateTime); 
    $book->setGender('Scfi'); 
    $book->setDescription('Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. 
    Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in 
    voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt 
    mollit anim id est laborum.'); 

    // we call the service 
    $bookManager = $this->get('book.manager'); 

    // we call the method you need 
    $bookManager->createBook($book); 


    // same to: $bookManager = $this->get('book.manager')->createBook($book); 
} 

希望它會幫助你...