【问题标题】:Symfony2: Using Doctrine outside controllerSymfony2:在控制器外部使用 Doctrine
【发布时间】:2014-10-15 10:53:45
【问题描述】:

我在 OOP PHP 方面有点菜鸟,所以如果我把这听起来更复杂,请原谅我。

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

我已经设置了我的实体,我还创建了一个存储库,用于将一些 db 查询的方法添加到 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 中创建了一个新类,并使用服务将教义注入其中并调用自定义方法,获取结果,然后将来自 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

【问题讨论】:

    标签: symfony doctrine


    【解决方案1】:

    刚刚检测到我脑海中出现的两件事。

    1 如果您将服务定义为:

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

    然后你可以像here 描述的那样将它注入到控制器中,这样你就可以将服务参数排除在控制器之外:

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

    其次,我不会把这个标准查询放在模型中,我认为最好用它们的 setter、getter 来保持模型的干净,并将这个自定义查询放在其他地方,比如在处理所有相关图表查询的服务中,你可以来自其他任何地方的实例。

    【讨论】:

    • 感谢您的意见,非常感谢。我会做出这些改变。对于 Symfony 中的“模型”真正代表什么,我仍然有点困惑。从我所读到的 Symfony 中的模型完全取决于你。我把它放在模型类还是服务类真的重要吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多