zf2 - 将参数传递给服务管理器
zf2 - pass argument to service manager
我有一个工厂服务,我想在其中从控制器发送额外的参数,这是我目前的做法。
$apiSuccess = new ApiSuccess(array(
'status' => 'success',
'code' => 'user_authenticate_success',
'href' => 'app/welcome',
'message' => 'User Authenticated Successfully'
));
$apiResponse = $this->getServiceLocator()->get('api_response');
$apiResponse->setHttpCode(200);
$apiResponse->setContent($apiSuccess);
$apiResponse->dispatch();
这是我的工厂服务class
class ApiJsonResponseFactory implements FactoryInterface
{
public function createService(ServiceLocatorInterface $serviceLocator)
{
return new ApiJsonResponseService($serviceLocator);
}
}
这是我的可调用服务 class:
class ApiJsonResponseService
{
protected $serviceManager;
protected $httpCode = null;
protected $content = null;
public function __construct(ServiceLocatorInterface $serviceManager)
{
$this->serviceManager = $serviceManager;
return $this;
}
public function getServiceManager()
{
return $this->serviceManager;
}
public function setHttpCode($httpCode)
{
$this->httpCode = $httpCode;
return $this;
}
public function getHttpCode()
{
return $this->httpCode;
}
public function setContent(ApiBaseResponseInterface $content)
{
$this->content = $content;
return $this;
}
public function getContent()
{
return $this->content;
}
public function dispatch()
{
if (null === $this->httpCode) {
throw new \Exception('Invalid or missing HTTP Code, set valid HTTP code using setHttpCode()');
}
if (null === $this->content) {
throw new \Exception('Invalid or missing content');
}
$response = $this->getServiceManager()->get('Response');
$response->setStatusCode($this->getHttpCode());
$apiJsonResponse = new ApiJsonResponse($this->content);
return $apiJsonResponse->dispatch();
}
}
这是按预期工作的,我想知道是否有更好的方法?
您不能将参数传递给服务管理器,但是,您可以将参数传递给 AbstractPluginManager。也就是说,我不会为此使用该策略。
我也不会将 ServiceManager 传递给您的 ApiJsonResponseService
class。服务管理器只获取响应对象,为什么不直接传递响应对象本身。
您的第一个代码块变为:
$apiSuccess = new ApiSuccess(array(
'status' => 'success',
'code' => 'user_authenticate_success',
'href' => 'app/welcome',
'message' => 'User Authenticated Successfully'
));
$response = $this->getResponse();
$apiResponse = new ApiJsonResponseService($response, 200, $apiSuccess);
$apiResponse->dispatch();
显然您还必须更新构造函数,并且响应的可用性取决于您在应用程序中的位置/是否注入它。
我有一个工厂服务,我想在其中从控制器发送额外的参数,这是我目前的做法。
$apiSuccess = new ApiSuccess(array(
'status' => 'success',
'code' => 'user_authenticate_success',
'href' => 'app/welcome',
'message' => 'User Authenticated Successfully'
));
$apiResponse = $this->getServiceLocator()->get('api_response');
$apiResponse->setHttpCode(200);
$apiResponse->setContent($apiSuccess);
$apiResponse->dispatch();
这是我的工厂服务class
class ApiJsonResponseFactory implements FactoryInterface
{
public function createService(ServiceLocatorInterface $serviceLocator)
{
return new ApiJsonResponseService($serviceLocator);
}
}
这是我的可调用服务 class:
class ApiJsonResponseService
{
protected $serviceManager;
protected $httpCode = null;
protected $content = null;
public function __construct(ServiceLocatorInterface $serviceManager)
{
$this->serviceManager = $serviceManager;
return $this;
}
public function getServiceManager()
{
return $this->serviceManager;
}
public function setHttpCode($httpCode)
{
$this->httpCode = $httpCode;
return $this;
}
public function getHttpCode()
{
return $this->httpCode;
}
public function setContent(ApiBaseResponseInterface $content)
{
$this->content = $content;
return $this;
}
public function getContent()
{
return $this->content;
}
public function dispatch()
{
if (null === $this->httpCode) {
throw new \Exception('Invalid or missing HTTP Code, set valid HTTP code using setHttpCode()');
}
if (null === $this->content) {
throw new \Exception('Invalid or missing content');
}
$response = $this->getServiceManager()->get('Response');
$response->setStatusCode($this->getHttpCode());
$apiJsonResponse = new ApiJsonResponse($this->content);
return $apiJsonResponse->dispatch();
}
}
这是按预期工作的,我想知道是否有更好的方法?
您不能将参数传递给服务管理器,但是,您可以将参数传递给 AbstractPluginManager。也就是说,我不会为此使用该策略。
我也不会将 ServiceManager 传递给您的 ApiJsonResponseService
class。服务管理器只获取响应对象,为什么不直接传递响应对象本身。
您的第一个代码块变为:
$apiSuccess = new ApiSuccess(array(
'status' => 'success',
'code' => 'user_authenticate_success',
'href' => 'app/welcome',
'message' => 'User Authenticated Successfully'
));
$response = $this->getResponse();
$apiResponse = new ApiJsonResponseService($response, 200, $apiSuccess);
$apiResponse->dispatch();
显然您还必须更新构造函数,并且响应的可用性取决于您在应用程序中的位置/是否注入它。