多个对象实例化预防?

时间:2018-01-04 01:06:11

标签: php oop object zend-framework2

我有一个带有用于存储对象的私有变量的类。 我有一个函数,首先检查该变量是否已经包含一个对象;如果没有,它会实例化所需的对象并将其设置为该变量,否则它只返回该变量的内容。

我想知道这里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;
    }
}

1 个答案:

答案 0 :(得分:0)

我不认为它有点矫枉过正,但我​​通常会避免在控制器中调用getServiceLocator()。

您所询问的基本上是确保满足控制器的依赖性要求。您可以将Factory用于相同的目的,并以更复杂的方式执行此操作。您可以创建工厂并将依赖项直接注入控制器。这样你就永远不会调用非对象变量。

为此,您需要创建一个实现FactoryInterface的类,该类将有一个方法createService,它将为您提供ServiceLocator。您可以使用该serviceLocator获取所有依赖项并将它们直接注入您的类。