2017-10-06 64 views
1

我想覆盖全局response function的返回类型,因为我创建了一个覆盖返回的响应类的包。服务提供商正在扩展将返回的响应类,而不是默认的\Illuminate\Http\Response。这是所有工作,并通过Laravel IDE helper生成IDE文件时也承认。是否可以重写全局函数的phpdoc返回类型?

我的问题是只有第一次调用所述函数列出了扩展类的方法。否则,它会列出引用\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 = []); 
} 

我该如何实现这一目标?

+0

你为什么要这么做?您的自定义响应类可以始终扩展Illuminate \ Http \ Response或底层Symfony \ Component \ HttpFoundation \ Response。但接口的一点是,它与其他引用相同接口的代码提供了固定的契约。所以,我认为重写方法并不是一个好主意。 – macghriogair

+0

至于你想要覆盖全局响应帮助函数的问题的一部分:这在全局名称空间中不应该是可能的,因为自动加载器会在你自己的函数之前加载Laravels帮助函数。但是你可以通过在自己的命名空间中重新定义它来帮助自己,参见回答“命名空间php> = 5.3的猴子补丁”在这里https://stackoverflow.com/questions/3620659/is-it-possible-to-overwrite-a-function-in-php – macghriogair

+0

我想实现的只是简单通过'response()'方法进行类型提示,该方法指向Laravel Contract,它在phpdoc中声明'Illuminate \ Http \ Response'作为返回类型,而不是'\ My \ Package \ Response'。 – Krenor

回答

1

实现,这将是创建一个自定义app/helpers.php文件,并在它覆盖了整个Laravel response功能与您的期望@返回类型的唯一途径。如果您通过使用作曲自动加载,然后添加

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

工作,因为Laravels辅助函数先被载入。 您必须手动需要在文件中您index.phpautoload.php前:

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

但要知道,这将打破你的单元测试,而不扭捏phpunit.xml包括自定义引导文件!

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

在一般情况下,我认为这样做只是IDE遵守它太哈克&没有优势可言。

相关问题