簡體   English   中英

如何使用symfony在實體類中調用學說

[英]How to call doctrine in an entity class using symfony

我正在為我的應用程序使用symfony框架。 為了將記錄保存在數據庫中,我想調用$ this-> getDoctrine()-> getManager();。 我的實體類中的方法。 但是,當我這樣做時,它給了我錯誤:調用未定義的方法getDoctrine(),

有人可以告訴我什么是正確的方法。

我的實體類如下:

命名空間Acme \\ SuperbAppBundle \\ Entity;

使用Symfony \\ Component \\ DependencyInjection \\ Container; 使用Doctrine \\ ORM \\ Mapping作為ORM;

class Users
{


/**
 * @var integer
 */
private $id;

/**
 * @var string
 */
private $firstName;

/**
 * @var string
 */

/**
 * Get id
 *
 * @return integer 
 */
public function getId()
{
    return $this->id;
}

/**
 * Set firstName
 *
 * @param string $firstName
 * @return Users
 */
public function setFirstName($firstName)
{
    $this->firstName = $firstName;

    return $this;
}

/**
 * Get firstName
 *
 * @return string 
 */
public function getFirstName()
{
    return $this->firstName;
}


function __construct($firstName){

    $this->setFirstName($firstName);

}

function save(){

    $em = $this->getDoctrine()->getManager();
    $em->persist($create);
    $em->flush();
}

}

我的控制器方法是這樣的:

   public function test(){

    $create = new Users('Rajat');

    $create->save();

 }

您的保存方法正在嘗試調用

$this->getDoctrine();

因此, $this是當前類以及它繼承的任何其他類。 就目前而言,您當前的Class User是獨立的,並且沒有getDoctrine()方法。 如果您的類要擴展Controller類,則可以訪問該方法:

class User extends Controller

我相信這個簡單的修補程序將起作用,盡管它對於擴展Controller可能沒有真正意義,因為它是用戶實體,並且與Controller無關。 一種首選的,更高級的方法是將Doctrine服務注入User類。

好的,首先是教義實體:處理實體的生成和配置聲明對setter和getter的操作。 如果要將對象保存到實體中,即用戶,則有兩種存儲方式:一種:可以使用實體管理器存儲用戶,實體將幫助您使用設置方法和獲取方法創建正確的對象:

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use PATH\TO\Users;

class ExampleController extends Controller
{
    public function examplefunction()
    {
       $em = $this->getDoctrine()->getManager();
       $entity = new Users();
       $entity->setFirstName('Rajat');
       $em->persist($entity);
       $em->flush();
    }
}

另一種方法是使用QueryBuilder創建此條目,但對您而言,這是一種不好的方法。 哦,我忘了請刪除已經在您的實體學說管理器中准備好的保存方法。

您的控制器可能不會擴展Symfony\\Bundle\\FrameworkBundle\\Controller\\Controller ...您應該像以下示例那樣定義控制器:

use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class DefaultController extends Controller
{
}

實體類不會擴展ContainerAware / Controller,因此您不能調用$ this-> getDoctrine()-> getManager()。 我認為您的Entity類不應該擴展到Controller。 因為您的實體類將僅由於您要訪問學說管理器而成為控制器實例。 這不是一個好習慣。 您可以做的是通過服務將學說管理器注入到Entity類中。

幾周前,我寫了一篇有關注入服務容器並通過構造函數訪問的博客。 您可以按照注入服務容器的相同方式注入理論實體管理器。 如果願意,可以看一下: -http : //anjanasilva.com/blog/injecting-services-in-symfony-2/

這是一個關於注入學說管理器的好問題。 確保您也閱讀答案。 -Symfony 2 EntityManager注入服務

還有另一個關於注入自定義存儲庫管理器而不是注入整個實體管理器的不錯的教程。 我相信這是一個很好的解決方案。 -http : //php-and-symfony.matthiasnoback.nl/2014/05/inject-a-repository-instead-of-an-entity-manager/

希望這有助於增進您對Symfony 2的了解。

干杯!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM