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

显然您还必须更新构造函数,并且响应的可用性取决于您在应用程序中的位置/是否注入它。