2017-10-06 89 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遵守它太哈克&沒有優勢可言。

相關問題