2017-07-17 56 views
0

我有兩種不同的方式來加載我的控制器與它的域模型。我有興趣聽到哪個更好。用於使用域對象填充控制器的zf2工廠

第一種方法 - 傳統。 控制器工廠將所需的服務注入到控制器構造函數中。內的控制器的動作,該模型被加載基於所述請求PARAM:

ClientAppointmentsControllerFactory.php

class ClientAppointmentsControllerFactory implements FactoryInterface 
{ 
    public function createService(ServiceLocatorInterface $serviceLocator) {  
     $serviceManager = $serviceLocator->getServiceLocator(); 
     $controller = new ClientAppointmentsController($serviceManager->get('Service\ClientAppointments')); 
     return $controller; 
    } 
} 

ClientAppointmentsController.php

class ClientAppointmentsController extends AbstractActionController 
{ 
    public function __construct(AppointmentFactory $appointmentFactory){ 
     $this->appointmentFactory = $appointmentFactory; 
    } 

    public function indexAction() { 
     $viewModel = $this->acceptableViewModelSelector($this->acceptCriteria); 
     $appointments = $this->appointmentFactory->getClientAppointments($this->params()->fromRoute('clientId')); 
     $viewModel->setVariables([ 
      'appointments' => $appointments 
     ]); 
     return $viewModel; 
    } 
} 

第二方法 - 在工廠訪問請求/路由參數 這對我來說似乎有點乾淨,因爲現在控制器不依賴於服務層,只是期望(從任何來源)數組加載的對象傳遞給視圖。我想,這還是符合工廠的定義,因爲它是建立與它所需的依賴控制器,雖然目前正積極創建它們,而不是通過這個到控制器做:

ClientAppointmentsControllerFactory.php

class ClientAppointmentsControllerFactory implements FactoryInterface 
{ 
    public function createService(ServiceLocatorInterface $serviceLocator) { 
     $getRequestParam = function($param) use($serviceLocator){ 
      $serviceManager = $serviceLocator->getServiceLocator(); 
      $request = $serviceManager->get('Request'); 
      $router = $serviceManager->get('Router'); 
      $match = $router->match($request); // \Zend\Mvc\Router\RouteMatch 
      $result = $match->getParam($param); 
      return $result; 
     }; 

     $serviceManager = $serviceLocator->getServiceLocator(); 
     $clientService = $serviceManager->get('Service\ClientAppointments'); 
     $appointments = $clientService->fetchByClientId($getRequestParam('clientId)); 
     $controller = new ClientAppointmentsController($appointments); 
     return $controller; 
    } 
} 

ClientAppointmentsController.php

class ClientAppointmentsController extends AbstractActionController 
{ 
    /** 
    * @param Array $appointments Array of Appointment objects 
    */ 
    public function __construct(Array $appointments){ 
     $this->appointments = $appointments 
    } 

    public function indexAction() { 
     $viewModel = $this->acceptableViewModelSelector($this->acceptCriteria); 
     $viewModel->setVariables([ 
      'appointments' => $this->appointments 
     ]); 
     return $viewModel; 
    } 

哪個更好?

(我也有一個可變的工廠漂浮的想法。)

回答

0

IMO,二是都不好,因爲它混合創建邏輯與商業邏輯。這意味着業務邏輯錯誤將阻止工廠工作。

第一個更好,但不好,因爲您現在已經掌握了控制器中的業務邏輯。

我會建議將業務邏輯轉移到業務模型或控制器插件。