【问题标题】:Is it possible to override the phpdoc return type of a global function?是否可以覆盖全局函数的 phpdoc 返回类型?
【发布时间】: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 .

标签: php laravel phpdoc


【解决方案1】:

实现这一点的唯一方法是创建一个自定义的 app/helpers.php 文件,并在其中使用您想要的 @return 类型覆盖整个 Laravel response 函数。如果您通过 Composer 使用自动加载,则添加

"autoload": {
    "files": ["app/helpers.php"]
}

工作,因为首先加载 Laravel 辅助函数。 您必须在 index.php 之前在 autoload.php 之前手动要求该文件:

require __DIR__ .'/../app/helpers.php';
require __DIR__.'/../vendor/autoload.php';

但请注意,这将破坏您的单元测试,而无需调整 phpunit.xml 以包含自定义引导文件!

或者,有一个作曲家插件(未测试)处理优先级问题:https://github.com/funkjedi/composer-include-files

总的来说,我认为这样做只是为了 IDE 合规性它太老套了,根本没有优势。

【讨论】:

    猜你喜欢
    • 2013-12-23
    • 2017-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-10
    • 2019-08-04
    • 1970-01-01
    相关资源
    最近更新 更多