2015-05-10 14 views
5

Sono nuovo di laravel (solo sperimentato laravel 5, in modo che nessun retaggio riagganciare qui)Extend Richiesta di classe in laravel 5

mi piacerebbe sapere come estendere la richiesta classe principale. Oltre a come estenderlo, mi piacerebbe sapere se è una saggia decisione progettuale di farlo.

Ho letto approfonditamente la documentazione (in particolare per quanto riguarda la registrazione dei fornitori di servizi e il modo in cui fornisce Facades l'accesso alle voci all'interno del contenitore delle dipendenze) - ma posso vedere (e trovare) nessun modo per sostituire il \Illuminate\Http\Request esempio con la mia

+1

Cosa stai cercando di realizzare? Perché vorresti sostituirlo con il tuo? –

+0

Sto lavorando a un pacchetto su GH atm - https://github.com/echo-it/laravel-jsonapi. È possibile vedere dal readme che hanno definito la propria richiesta, ma c'è così tanto codice ridondante in cui lo stanno compilando con le informazioni della richiesta principale. In realtà ho praticamente funzionante - aggiornando l'intance della richiesta nell'index.php - ma questo non sembra corretto. Inoltre, non funziona con i test delle unità. – ninjapenguin

+0

Penso che dipenda dai metodi che stai tentando di sovrascrivere, ad es. metodo json. È possibile estendere 'Illuminate \ Http \ Request' e creare una facciata – Digitlimit

risposta

23

Ecco documento ufficiale: Request Lifecycle

contenuto delle app/HTTP/CustomRequest.php

<?php namespace App\Http; 

use Illuminate\Http\Request as BaseRequest; 

class CustomRequest extends BaseRequest { 
    // coding 
} 

aggiungere questa linea al pubblico/index. php

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

dopo

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

cambiare il codice a pubblico/index.php

Illuminate\Http\Request::capture() 

a

App\Http\CustomRequest::capture() 
+0

Mi chiedo perché questo non è menzionato nei documenti di laravel. – PHPst

+0

Penso che a partire da 5.x l'idea sia di estendere la classe astratta 'app/Http/Requests/Request.php'. Questo è stato fatto per comodità, credo. Potrebbe essere sbagliato. – Michael

+1

Funziona, ma ho bisogno di estendere la richiesta solo per i controller specificati e non per tutti, ma facendo ciò, sto ricevendo la richiesta estesa in tutti i controller anche se scrivo la richiesta base. Qualche idea? –

2

ero oggi e ho lavorato sullo stesso argomento pensa che vale la pena ricordare che potresti semplicemente cambiare

Illuminate\Http\Request::capture() 

a

App\Http\CustomRequest::capture() 

senza l'aggiunta di linea

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

perché dentro capture() metodo laravel si lega effettivamente fornito classe a servizio contenitore con 'richiesta' come chiave

+0

** NB !!! ** '$ app-> alias ('richiesta', 'App \ Http \ CustomRequest');' è richiesto !!! Se omesso, quindi, ad es. I parametri POST non saranno presenti nell'oggetto App \ Http \ CustomRequest, ma vecchi Illuminate \ Http \ Request. –

+0

Funziona perfettamente se si desidera utilizzare una richiesta personalizzata per controller specifici. Grazie! (btw: Non ho dovuto aggiungere '$ app-> alias ('richiesta', 'App \ Http \ CustomRequest');' alla mia app.) –

2

immagino dovrai estendere anche RequestForm. Uso la caratteristica per evitare la duplicazione del codice. Il codice sottostante è rilevante per 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; 
} 

Per la prova phpunit di lavoro si dovrà eseguire l'override call metodo per rendere utilizzando giusto Request classi qui 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; 
    } 

} 

e non dimenticate di passare Illuminate\Http\Request::capture()-App\Http\Request::capture() in public/index.php di file e di aggiungere $app->alias('request', 'App\Http\Request'); dopo o all'interno $app = require_once __DIR__.'/../bootstrap/app.php';

+1

È ancora accurato per Laravel 5.4? Il contenuto $ della mia richiesta sembra essere vuoto nei miei test di funzionalità/integrazione. – joelcox