2015-04-25 110 views
1

我想覆蓋類Illuminate\Http\Response的方法setContent()爲:Laravel 5覆蓋一個類的方法

<?php 
namespace MyNameSpace\MyClass; 

use Illuminate\Http\Response; 
class myResponse extends Reponse { 
    public function setContent($content) 
    // Something 
    } 
} 

但我不知道如何告訴Laravel加載我的課,而不是原來的。

回答

1

您將需要擴展Response facade以反映您擁有的課程,然後將您的applications /config/app.php更改爲鏈接到新門面而不是laravel。

+0

謝謝您響應,但它不工作,也許是因爲它不是一個門面,我試圖覆蓋「Illuminate \ Http \ Response」而不是「Illuminate \ Support \ Facades \ Request」 – zeomega

+0

「Facade」是訪問點'回覆sponse'對象,這是laravel使用的。 –

0

您需要創建像這樣

<?php namespace App\Facades; 

use Illuminate\Support\Facades\Response as BaseResponse; 

class Response extends BaseResponse { 

    public static function overwriteMethod() 
    { 
     // 
    } 

} 

門面然後去配置/下外牆app.php註釋掉該行

//'Response' => 'Illuminate\Support\Facades\Response', 

然後將其添加到外牆堆

'Response' => 'App\Facades\Response', 
+0

感謝您的迴應,但它不工作,也許是因爲它不是一個門面,我試圖覆蓋「Illuminate \ Http \ Response」而不是「Illuminate \ Support \ Facades \ Request」 – zeomega

+0

我已經編輯回答 – Digitlimit

1

太晚了,但因爲我想出了同樣的問題。但供參考,我想發佈我如何解決這個問題。

當我想要自己處理所有的響應而不使用響應宏或變換器,並且覆蓋許多其他框架默認方法。這是我完全控制了響應對象的方式。

剛剛發佈供參考,因爲我認爲它以更清晰的方式解決了 問題。

很多重寫通過管道和路由完成,因此它被註冊爲基礎服務提供商。這是我如何設法覆蓋所有。

這裏我使用laravel 5.3

1 - 創建一個新的響應類

<?php 

namespace App\Extensions\Illuminate\Http; 

// use Illuminate\Http\Response as BaseResponse; 
use Symfony\Component\HttpFoundation\Response as BaseResponse; 

class Response extends BaseResponse 
{ 
    public function setContent($content) 
    { 
     //do what ever you want to do with the content 
     //dd($content); 
    } 
} 

2 - 創建一個新的路由器,並使用新的響應

<?php 

namespace App\Extensions\Illuminate\Routing; 

use Illuminate\Http\Request; 
use Illuminate\Routing\Events\RouteMatched; 
use Illuminate\Routing\Router as IlluminateRouter; 
use App\Extensions\Illuminate\Http\Response; 

class Router extends IlluminateRouter 
{ 

    public function prepareResponse($request, $response) 
    { 
     if ($response instanceof PsrResponseInterface) { 
      $response = (new HttpFoundationFactory)->createResponse($response); 
     } elseif (! $response instanceof SymfonyResponse) { 
      $response = new Response($response); 
     } 

     return $response->prepare($request); 
    } 
} 

3 - 創建新的路由服務提供商使用新路由器

<?php 

namespace App\Providers; 

use Illuminate\Routing\RoutingServiceProvider as ServiceProvider; 
use App\Extensions\Illuminate\Routing\Router; 


class RoutingServiceProvider extends ServiceProvider 
{ 
    protected function registerRouter() 
    { 
     $this->app['router'] = $this->app->share(function ($app) { 
      return new Router($app['events'], $app); 
     }); 
    } 
} 

4 - 創建新的應用程序類,並使用新的路由服務提供商

<?php 

namespace App\Extensions\Illuminate\Foundation; 

use Illuminate\Events\EventServiceProvider; 
use Illuminate\Foundation\Application as App; 
use App\Providers\RoutingServiceProvider; 

class Application extends App 
{ 
    protected function registerBaseServiceProviders() 
    { 
     $this->register(new EventServiceProvider($this)); 

     $this->register(new RoutingServiceProvider($this)); 
    } 
} 

5 - 在引導,最後\ app.php使用新的申請

// $app = new Illuminate\Foundation\Application(
//  realpath(__DIR__.'/../') 
//); 
$app = new App\Extensions\Illuminate\Foundation\Application(
    realpath(__DIR__.'/../') 
);