zf2 - 将参数传递给服务管理器

时间:2015-04-07 08:17:38

标签: zend-framework2

我有一个工厂服务,我想从控制器发送额外的参数,这是我目前的工作方式。

$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 ApiJsonResponseFactory implements FactoryInterface
{
    public function createService(ServiceLocatorInterface $serviceLocator)
    {
        return new ApiJsonResponseService($serviceLocator);
    }
}

这是我的可调用服务类:

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();
    }
}

这是按预期工作的,我想知道是否有更好的方法可以做到这一点?

1 个答案:

答案 0 :(得分:2)

您无法将参数传递给服务管理器,但是,您可以将参数传递给AbstractPluginManager。也就是说,我不会用这个策略。

我也不会将ServiceManager传递给您的ApiJsonResponseService课程。服务管理器只获取Response对象,为什么不直接传递响应对象。

您的第一个代码块变为:

$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();

显然你还需要更新构造函数,响应的可用性取决于你在应用程序中的位置/如果你注入它。

相关问题