Symfony2:在控制器外部使用Doctrine

时间:2014-10-15 10:53:45

标签: symfony doctrine

关于OOP PHP,我有点像菜鸟,所以请原谅我,如果我把这个声音变得更复杂,那么就是这样。

基本上我正在尝试清理我的控制器,因为它开始变得太杂乱。

我已经设置了实体,并且我还创建了一个存储库,用于将某些数据库查询的方法添加到sqlite数据库。

但是现在我还必须在输出之前操纵这些数据,我已经创建了一个单独的连接器类,它为每个被查询的项目提取附加信息(来自XML Web源),然后将其添加到学说中在输出之前查询数据。

我可以在存储库中操作这些数据,但我添加的数据显然不是来自我的实体。因此,我创建了一个单独的模型类来添加这些数据。

请告诉我,我是否走在正确的轨道上。

在我的实体存储库中,我将有一个这样的自定义方法:

public function queryTop10All()
{
    $query = $this->getEntityManager($this->em)
        ->createQueryBuilder('u')
            ->select('u.ratingkey, u.origTitle, u.origTitleEp, u.episode, u.season, u.year, u.xml, count(u.title) as playCount')
            ->from($this->class, 'u')
            ->groupBy('u.title')
            ->orderBy('playCount', 'desc')
            ->addOrderBy('u.ratingkey', 'desc')
            ->setMaxResults(10)
            ->getQuery();

    return $query->getResult();
}

现在我在\ Model \ ChartsDataModel.php中创建了一个新类,我正在使用服务注入doctrine并调用自定义方法,获取结果,然后从Web连接器添加其他数据,就像这样:

namespace PWW\DataFactoryBundle\Model;

use Doctrine\ORM\EntityManager;
use PWW\DataFactoryBundle\Connector\XMLExtractor;
use PWW\DataFactoryBundle\Connector\WebConnector;
use PWW\ContentBundle\Entity\Settings;

class ChartsDataModel {

    private $settings;
    private $repository;
    private $em;

    public function __construct(EntityManager $em)
    {
        $this->settings = new Settings();
        $this->repository = $this->settings->getGroupingCharts() ? 'PWWDataFactoryBundle:Grouped' : 'PWWDataFactoryBundle:Processed';
        $this->em = $em;
    }

    public function getChartsTop10All()
    {
        $xmlExtractor = new XMLExtractor();
        $webConnector = new WebConnector();

        $results = $this->em->getRepository($this->repository)->queryTop10All();
        $xml = $xmlExtractor->unXmlArray($results);

        $outputArray = array();

        foreach($xml as $item) {
            $outputArray[] = array(
                "ratingKey" => $item['ratingkey'],
                "origTitle" => $item['origTitle'],
                "origTitleEp" => $item['origTitleEp'],
                "playCount" => $item['playCount'],
                "episode" => $item['episode'],
                "season" => $item['season'],
                "year" => $item['year'],
                "type" => $item['media']['type'],
                "parent" => $webConnector->getMetaData($webConnector->getMetaDataParentKey($item['ratingkey'])),
                "metadata" => $webConnector->getMetaData($item['ratingkey'])
            );
        }

        return $outputArray;
    }
}

xmlExtractor类用于将存储在数据库字段中的某些xml字段拉出为原始xml转储。

我的config.yml:

services:
    pww.datafactorybundle.model.charts_data_model:
        class: PWW\DataFactoryBundle\Model\ChartsDataModel
        arguments: [ @doctrine.orm.entity_manager ]

然后在我的控制器中,我只是实例化一个新的ChartsDataModel并像这样调用方法:

namespace PWW\ContentBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
...
use PWW\DataFactoryBundle\Model\ChartsDataModel;

    public function chartsAction()
    {

        $charts = new ChartsDataModel($this->getDoctrine()->getManager());
        $top10Array = $charts->getChartsTop10All();

        return $this->render('PWWContentBundle:Default:charts.html.twig', array('page' => 'charts', 'top10' => $top10Array));
    }

我只是想知道我是否正确地做到这一点,是否有更好的方法(或正确的方式)?

我对Symfony也很陌生,并且仍然围绕着它。我只是不想养成坏习惯,所以我从一开始就尝试做正确的事。

我希望我能够很好地解释这一点:)

TIA

1 个答案:

答案 0 :(得分:0)

刚刚发现了我头脑中的两件事。

1如果您定义服务,如:

services:
pww.datafactorybundle.model.charts_data_model:
    class: PWW\DataFactoryBundle\Model\ChartsDataModel
    arguments: [ @doctrine.orm.entity_manager ]

然后你可以将它注入控制器,如描述here,所以你将服务参数保留在Controller之外:

    public function chartsAction()
{
 $myservice = $this->get('pww.datafactorybundle.model.charts_data_model');
 $top10Array = $myservice->getChartsTop10All();
}

其次,我不会将这个标准查询放在模型中,我认为最好用他们的setter,getter保持模型干净,并将这些自定义查询放在其他地方,就像处理所有相关Chart查询的服务一样,你可以来自其他地方的实例。