2017-10-06 5 views
1

返される応答クラスをオーバーライドするパッケージを作成したので、グローバルresponse functionの戻り値の型をオーバーライドします。サービスプロバイダは、デフォルトの\Illuminate\Http\Responseの代わりに返される応答クラスを拡張しています。これはすべて動作しており、Laravel IDE helperでIDEファイルを生成するときにも認識されます。グローバル関数の戻り値の型をオーバーライドすることはできますか?

私の問題は、上記関数のの最初の呼び出しであるが、拡張するクラスメソッドをリストしているということです。さもなければ、私はオーバーライドしたいと思うものである\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ヘルパ関数をロードするため、グローバル名前空間では使用できません。しかし、あなた自身の名前空間でそれを再定義することによって、自分自身を助けることができます。 Answer "Monkey patch in namespace php> = 5.3"ここhttps://stackoverflow.com/questions/3620659/is-it-possible-to-overwrite-a-function-in-php – macghriogair

+0

私が達成したいのは、単純に'\ My \ Package \ Response'ではなく' \ Illuminate \ Http \ Response'を戻り値の型としてphpdocに書いているLaravel Contractを指し示す 'response()'メソッドで型ヒントを持っています。 – Krenor

答えて

1

これを達成する唯一の方法は、カスタムapp/helpers.phpファイルを作成することであり、Laravel response関数全体を、必要な@return型でオーバーライドします。 Laravelsのヘルパー関数が最初にロードされているので

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

意志ない仕事を追加、その後、あなたが作曲経由で自動ロードを使用している場合。 あなたはautoload.php前にindex.phpに手動でファイルを必要とする必要があります。このカスタムブートストラップファイルをインクルードするphpunit.xmlを微調整することなく、あなたのユニットテストを中断します

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

をしかし、注意してください!

はまた、優先順位の問題に対処作曲プラグイン(テストしていません)があります:一般的にhttps://github.com/funkjedi/composer-include-files

が、私はIDE準拠ため、このを行うことは、それがすべてで利用&あまりにもハックではないと思います。

関連する問題