关于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
答案 0 :(得分:0)
刚刚发现了我头脑中的两件事。
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查询的服务一样,你可以来自其他地方的实例。