我有一个带有用于存储对象的私有变量的类。 我有一个函数,首先检查该变量是否已经包含一个对象;如果没有,它会实例化所需的对象并将其设置为该变量,否则它只返回该变量的内容。
我想知道这里getSessionCustomer()
是否过度/不必要或是否有实际好处。我只是基于Zend的Album教程,但是我还没有完全测试它才真正看到优点(或缺点)。据我所知,文档中没有解释为什么包含这个附加功能。
class JobController extends AbstractActionController
{
private $SessionCustomer;
public function saveJobAction()
{
$SessionCustomer = $this->getSessionCustomer();
if(empty($SessionCustomer->offsetGet('customer_id'))) {
return $this->redirect()->toRoute('login');
} else {
$JobService = $this->getServiceLocator()->get('Job\Factory\JobServiceFactory');
$job_id = $JobService->saveJob();
return $this->redirect()->toUrl('/job/' . $job_id);
}
}
public function viewJobAction()
{
$sm = $this->getServiceLocator();
$SessionCustomer = $this->getSessionCustomer();
if(empty($SessionCustomer->offsetGet('customer_id'))) {
return $this->redirect()->toRoute('login');
} else {
$JobTable = $sm->get('Job\Model\JobTable');
$JobItemTable = $sm->get('Job\Model\JobItemTable');
$jobId = $this->params()->fromRoute('id');
$Job = $JobTable->getJobById($jobId);
$JobItems = $JobItemTable->getJobItemsByJobId($jobId);
$this->layout()->setVariable('title', 'Order #' . $jobId);
$viewModel = new ViewModel();
$viewModel->setVariables(array(
'Job' => $Job,
'JobItems' => $JobItems
));
return $viewModel;
}
}
private function getSessionCustomer()
{
if(!$this->SessionCustomer) {
$this->SessionCustomer = $this->getServiceLocator()->get('Session\Customer');
}
return $this->SessionCustomer;
}
}
答案 0 :(得分:0)
我不认为它有点矫枉过正,但我通常会避免在控制器中调用getServiceLocator()。
您所询问的基本上是确保满足控制器的依赖性要求。您可以将Factory
用于相同的目的,并以更复杂的方式执行此操作。您可以创建工厂并将依赖项直接注入控制器。这样你就永远不会调用非对象变量。
为此,您需要创建一个实现FactoryInterface
的类,该类将有一个方法createService
,它将为您提供ServiceLocator
。您可以使用该serviceLocator获取所有依赖项并将它们直接注入您的类。