Laravel 5覆盖类方法

时间:2015-04-25 19:54:25

标签: php override laravel-5

我想将类setContent()的方法Illuminate\Http\Response覆盖为:

<?php 
namespace MyNameSpace\MyClass;

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

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

3 个答案:

答案 0 :(得分:2)

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

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

  

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

通过管道和路由完成了很多覆盖,因此它被注册为基础服务提供商。这是我如何设法覆盖所有。

  

这里我使用的是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 - 创建新的Application类并使用新的路由服务提供程序

<?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 - 最后在 bootstrap \ app.php 中使用新的应用程序

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

答案 1 :(得分:1)

您需要延长Response facade以反映您所拥有的课程,然后将applications /config/app.php更改为您的新门面而不是laravel。

答案 2 :(得分:1)

您需要创建一个这样的外观

<?php namespace App\Facades;

use Illuminate\Support\Facades\Response as BaseResponse;

class Response extends BaseResponse {

    public static function overwriteMethod()
    {
        //
    }

}

然后转到facades下面的config / app.php注释掉这一行

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

然后将其添加到外墙堆栈

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