Расширить класс запроса в Laravel 5

Я новичок в Laravel (только опытный Laravel 5, поэтому здесь не осталось никакого наследия)

Я хотел бы знать, как расширить основной класс запроса. В дополнение к тому, как продлить его, я хотел бы знать, является ли это разумным дизайнерским решением.

Я подробно прочитал документацию (особенно в отношении регистрации поставщиков услуг и способа, которым он предоставляет доступ к Facades для записей в контейнере зависимостей), но я не вижу (и не обнаруживаю) никакого способа заменить \Illuminate\Http\Request с моим собственным

Вот официальный документ: жизненный цикл запроса

Содержимое приложения / Http / CustomRequest.php

 <?php namespace App\Http; use Illuminate\Http\Request as BaseRequest; class CustomRequest extends BaseRequest { // coding } 

добавьте эту строку в public / index.php

 $app->alias('request', 'App\Http\CustomRequest'); 

после

 app = require_once __DIR__.'/../bootstrap/app.php'; 

изменить код на public / index.php

 Illuminate\Http\Request::capture() 

в

 App\Http\CustomRequest::capture() 

Сегодня я работал над тем же вопросом, и думаю, стоит упомянуть, что вы можете просто изменить

 Illuminate\Http\Request::capture() 

в

 App\Http\CustomRequest::capture() 

без добавления строки

 $app->alias('request', 'App\Http\CustomRequest'); 

потому что метод inner capture() laravel фактически связывает предоставленный класс с контейнером обслуживания с «запросом» в качестве ключа

Думаю, вам придется расширять и RequestForm . Я использую черту, чтобы избежать дублирования кода. Код ниже относится к Laravel 5.3 .

app/Http/ExtendRequestTrait.php

 <?php namespace App\Http\ExtendRequestTrait; trait ExtendRequestTrait { methodFoo(){} methodBar(){} } 

app/Http/Request.php

 <?php namespace App\Http; use Illuminate\Http\Request as BaseRequest; class Request extend BasicRequest { use ExtendRequestTrait; } 

app/Http/FormRequest.php

 <?php namespace App\Http; use Illuminate\Foundation\Http\FormRequest as BaseFormRequest; class FormRequest extend BasicFormRequest { use ExtendRequestTrait; } 

Для работы с phpunit test вам придется переопределить метод call чтобы сделать его с помощью права класса Request::create здесь Request::create .

test/TestCase.php

 <?php use App\Http\Request; abstract class TestCase extends Illuminate\Foundation\Testing\TestCase{ // just copy Illuminate\Foundation\Testing\TestCase `call` method // and set right Request class public function call($method, $uri, $parameters = [], $cookies = [], $files = [], $server = [], $content = null) { $kernel = $this->app->make('Illuminate\Contracts\Http\Kernel'); $this->currentUri = $this->prepareUrlForRequest($uri); $this->resetPageContext(); $request = Request::create( $this->currentUri, $method, $parameters, $cookies, $files, array_replace($this->serverVariables, $server), $content ); $response = $kernel->handle($request); $kernel->terminate($request, $response); return $this->response = $response; } } 

и не забудьте переключить Illuminate\Http\Request::capture() в App\Http\Request::capture() в файле public/index.php и добавить $app->alias('request', 'App\Http\Request'); после или внутри $app = require_once __DIR__.'/../bootstrap/app.php';