Я новичок в 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';