Laravel 5重写类方法



我想将类IlluminateHttpResponse的方法setContent()重写为:

<?php 
namespace MyNameSpaceMyClass;
use IlluminateHttpResponse;
class myResponse extends Reponse {
public function setContent($content)
// Something
}
}

但我不知道如何告诉Laravel加载我的类,而不是原来的类。

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

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

刚刚发布在这里供参考,因为我认为它解决了以更清晰的方式解决问题。

大量重写是通过管道和路由完成的,因此它被注册为基本服务提供商。以下是我如何设法覆盖所有内容的。

这里我使用的是laravel 5.3

1-创建一个新的响应类

<?php
namespace AppExtensionsIlluminateHttp;
// use IlluminateHttpResponse as BaseResponse;
use SymfonyComponentHttpFoundationResponse 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 AppExtensionsIlluminateRouting;
use IlluminateHttpRequest;
use IlluminateRoutingEventsRouteMatched;
use IlluminateRoutingRouter as IlluminateRouter;
use AppExtensionsIlluminateHttpResponse;
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 AppProviders;
use IlluminateRoutingRoutingServiceProvider as ServiceProvider;
use AppExtensionsIlluminateRoutingRouter;

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

4-创建新的应用程序类并使用新的路由服务提供商

<?php
namespace AppExtensionsIlluminateFoundation;
use IlluminateEventsEventServiceProvider;
use IlluminateFoundationApplication as App;
use AppProvidersRoutingServiceProvider;
class Application extends App
{
protected function registerBaseServiceProviders()
{
$this->register(new EventServiceProvider($this));
$this->register(new RoutingServiceProvider($this));
}
}

5,最后在bootstrap\app.php中使用新的应用程序

// $app = new IlluminateFoundationApplication(
//     realpath(__DIR__.'/../')
// );
$app = new AppExtensionsIlluminateFoundationApplication(
realpath(__DIR__.'/../')
);

您需要扩展Responsefacade以反映您所拥有的类,然后更改应用程序/config/app.php以链接到您的新facade而不是laravels。

您需要创建一个类似的外观

<?php namespace AppFacades;
use IlluminateSupportFacadesResponse as BaseResponse;
class Response extends BaseResponse {
public static function overwriteMethod()
{
//
}
}

然后转到facades下的config/app.php,注释出这行

//'Response'  => 'IlluminateSupportFacadesResponse',

然后将其添加到立面堆栈

'Response'  => 'AppFacadesResponse',

最新更新