2015-04-25 2 views
1

Я хотел бы переопределить метод setContent() класса Illuminate\Http\Response как:Laravel 5 Override метод класса

<?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, чтобы ссылаться на ваш новый фасад, а не на laravels.

+0

Спасибо за ваше ответ, но он не работает, может быть, потому что это не фасад, я пытаюсь переопределить «Illuminate \ Http \ Response», а не «Illuminate \ Support \ Facades \ Request» – zeomega

+0

«Фасад» - это точка доступа к 'Re 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__.'/../') 
); 
Смежные вопросы