【发布时间】:2018-03-18 01:43:02
【问题描述】:
我想覆盖全局 response function 的返回类型,因为我创建了一个覆盖返回的响应类的包。服务提供者正在扩展响应类,它将返回默认的\Illuminate\Http\Response。通过Laravel IDE helper 生成 IDE 文件时,这一切正常,并且也被识别。
我的问题是,只有上述函数的 first call 列出了扩展类方法。否则,它会列出引用 \Illuminate\Contracts\Routing\ResponseFactory 接口的 phpdocs 中的方法,这是我要覆盖的方法。我的接口只是将返回类型更改为我的包的响应类:
<?php
namespace My\Package;
use Illuminate\Contracts\Routing\ResponseFactory as BaseResponseFactory;
interface ResponseFactory extends BaseResponseFactory
{
/**
* Return a new response from the application.
*
* @param string $content
* @param int $status
* @param array $headers
*
* @return \My\Package\Response
*/
public function make($content = '', $status = 200, array $headers = []);
/**
* Return a new view response from the application.
*
* @param string $view
* @param array $data
* @param int $status
* @param array $headers
*
* @return \My\Package\Response
*/
public function view($view, $data = [], $status = 200, array $headers = []);
}
我怎样才能做到这一点?
【问题讨论】:
-
您为什么要这样做?你的自定义响应类总是可以扩展 Illuminate\Http\Response 或底层的 Symfony\Component\HttpFoundation\Response。但是接口的意义在于它为您提供了与引用相同接口的其他代码的固定合同。所以,我认为重写其中的方法不是一个好主意。
-
关于您想要覆盖全局响应辅助函数的部分问题:这在全局命名空间中是不可能的,因为自动加载器在您自己的函数之前加载 Laravel 辅助函数。但是您可以通过在自己的命名空间中重新定义它来帮助自己,参见。在此处回答“命名空间 php >= 5.3 中的猴子补丁”stackoverflow.com/questions/3620659/…
-
我想要实现的只是简单地通过
response()方法进行类型提示,该方法指向 Laravel 合约,其中将\Illuminate\Http\Response声明为 phpdoc 中的返回类型,而不是\My\Package\Response.