我正在努力在代码中找到放置数据库读取代码的正确位置,以及将数据库中读取的数据传递给接收对象的正确方法。下面是我的代码。注意$metaData
变量。这就是所讨论的变量(它从DB接收数据,然后传递给接收对象)。
class Controller
{
// generages PDF with data placed in specific areas of PDF
public function generateOutline($outputData)
{
// PDF library engine
$pdfEngine = new PdfEngine();
// Doctrine ORM Database Connector
$em = DoctrineConnector::getEntityManager();
// object containing metadata describing where to place data for $outputData
$metaData = $em->getRepository(Metadata::class)->findAll();
//method that places $outputData as described by $metaData
$pdfEngine->generateOutline($metaData, $outputData);
}
}
// part of View, because PDF is displayed to us
class PdfEngine
{
public function generateOutline(Metadata $metaData, array $data)
{
$this->placeTextOnPdf($metaData, $data);
}
}
问题
我很难弄清楚在哪里放置$metaData
构造。你看。。$metaData
是从数据库(在我的代码中)中读取的一个变量
我可以将数据库置于视图中吗?不是。视图本身不应涉及数据库的详细信息。
我可以将数据库放入控制器吗?不是真的应该是"瘦控制器,胖模型"
我可以把它放在模型里吗?模型在哪里?它是什么?我该把代码放在哪里?
我最终做了这样的事情。。
class Controller
{
public function generateOutline($input)
{
$data = $this->inputFilter->getOutlineRequestData($input);
//leaving around some existing processing code
//may have to find a better place for it later
$processor = (new OutlineProcessorFactory())->getProcessor($input['line']);
$output = $processor->processInput($data);
//encapsulated my code in a "service" layer
$this->pdfService->renderPdf($output);
}
}
class PdfService()
{
function renderPdf($output);
{
$pdfEngine = new PdfEngine();
$em = DoctrineConnector::getEntityManager();
$metaData = $em->getRepository(Metadata::class)->findAll();
$pdfEngine->generateOutline($metaData, $outputData);
}
}