Php Laravel 5重写一个类方法

Php Laravel 5重写一个类方法,php,overriding,laravel-5,Php,Overriding,Laravel 5,我想重写类illighted\Http\Response的方法setContent(),如下所示: <?php namespace MyNameSpace\MyClass; use Illuminate\Http\Response; class myResponse extends Reponse { public function setContent($content) // Something } } 您需要扩展以反映您所拥有的类,然后将链接更改为指向新的

我想重写类
illighted\Http\Response
的方法
setContent()
,如下所示:

<?php 
namespace MyNameSpace\MyClass;

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

您需要扩展以反映您所拥有的类,然后将链接更改为指向新的facade而不是laravels。

您需要创建这样的facade

<?php namespace App\Facades;

use Illuminate\Support\Facades\Response as BaseResponse;

class Response extends BaseResponse {

    public static function overwriteMethod()
    {
        //
    }

}
然后将其添加到facades堆栈中

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

太晚了,但我提出了同样的问题。但作为参考,我想发布我是如何解决这个问题的

当我想自己处理所有的响应时,不使用响应宏或转换器,覆盖许多其他框架默认方法。这就是我完全控制响应对象的方式

只是贴在这里作为参考,因为我认为它解决了问题 以更清晰的方式解决问题

很多重写都是通过管道和路由完成的,因此它注册为基本服务提供者。下面是我如何成功地覆盖所有的

这里我使用的是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);
    }
}

感谢您的回复,但它不起作用,可能是因为它不是一个facade,我试图覆盖“light\Http\response”而不是“light\Support\Facades\Request”
facade
response
对象的访问点,这是laravel使用的。感谢您的回复,但它不起作用,可能是因为它不是一个门面,我试图覆盖“light\Http\Response”而不是“light\Support\Facades\Request”
<?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);
    }
}
<?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);
    }
}
<?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);
        });
    }
}
<?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));
    }
}
// $app = new Illuminate\Foundation\Application(
//     realpath(__DIR__.'/../')
// );
$app = new App\Extensions\Illuminate\Foundation\Application(
    realpath(__DIR__.'/../')
);