2014-11-19 29 views
5

Capisco che la classe predefinita Eloquent\Collection può essere ignorata nel modello utilizzando il metodo:Estendere la laravel Eloquente Class Collection

public function newCollection(array $models = array()) { 

    return new CustomCollection($models); 
} 

Quali grandi opere se sto utilizzando query tipici come:

Model::where('name', $name)->get(); 

Questo è grande in modo da poter aggiungere metodi alla classe collezione eloquente, come ad esempio:

$records = Model::where('name', $name)->get(); 

$records->toTable(); 

Ma se sto usando l'impaginazione del modello, ad esempio:

Model::where('name', $name)->paginate(25); 

Si restituisce un'istanza della classe Illuminate\Support\Collection al posto del Illuminate\Database\Eloquent\Collection.

C'è un modo per ignorare o estendere il tipico Illuminate\Support\Collection?

Sto tentando di aggiungere un metodo toTable() alla raccolta restituita. Preferirei non dover sostituire il fornitore del servizio di impaginazione con il mio.

Grazie !!

risposta

6

Sarà necessario sostituire il fornitore del servizio di impaginazione, tra un paio di altre classi nella libreria di impaginazione. A giudicare dal suono, sai come farlo in questo modo, ma speravi in ​​un'altra risposta, ma dato che ho il codice lo lascerò qui per te.

Il motivo per cui è necessario sostituire queste classi/metodi è perché i file in Illuminate fanno riferimento direttamente alle istanze di classi all'interno dello spazio dei nomi Illuminate.

in config/app.php

Sostituire

'Illuminate\Pagination\PaginationServiceProvider', 

Con

'ExtendedPaginationServiceProvider', 

Creare un nuovo file da qualche parte il caricatore automatico è in grado di trovare lo chiama ExtendedPaginationServiceProvider.php e inserire il seguente in esso

<?php 

use Illuminate\Support\ServiceProvider; 

class ExtendedPaginationServiceProvider extends ServiceProvider 
{ 
    /** 
    * @inheritdoc 
    */ 
    public function register() 
    { 
     $this->app->bindShared('paginator', function($app) 
     { 
      $paginator = new ExtendedPaginationFactory($app['request'], $app['view'], $app['translator']); 

      $paginator->setViewName($app['config']['view.pagination']); 

      $app->refresh('request', $paginator, 'setRequest'); 

      return $paginator; 
     }); 
    } 
} 

Creare un nuovo file da qualche parte il caricatore automatico è in grado di trovare che ha definito ExtendedPaginationFactory.php e inserire il seguente in esso

<?php 

use Illuminate\Pagination\Factory; 

class ExtendedPaginationFactory extends Factory 
{ 
    /** 
    * @inheritdoc 
    */ 
    public function make(array $items, $total, $perPage = null) 
    { 
     $paginator = new ExtendedPaginationPaginator($this, $items, $total, $perPage); 

     return $paginator->setupPaginationContext(); 
    } 
} 

creare un nuovo file da qualche parte il caricatore automatico è in grado di trovare che ha definito ExtendedPaginationPaginator.php e luogo il seguente in esso

<?php 

use Illuminate\Pagination\Paginator; 

class ExtendedPaginationPaginator extends Paginator 
{ 
    /** 
    * Get a collection instance containing the items. 
    * 
    * @return ExtendedCollection 
    */ 
    public function getCollection() 
    { 
     return new ExtendedCollection($this->items); 
    } 
} 

Si noterà quanto sopra restituisce una nuova istanza di ExtendedCollection. Ovviamente sostituiscilo con la tua classe CustomCollection a cui fai riferimento nella tua domanda.

Per gli altri a riferimento, una classe ExtendedCollection potrebbe essere simile al di sotto

Creare un nuovo file da qualche parte il caricatore automatico è in grado di trovare lo chiama ExtendedCollection.php e inserire il seguente in esso

<?php 

use Illuminate\Support\Collection; 

class ExtendedCollection extends Collection 
{ 

} 

Inoltre, dopo la creazione di questi file, non dimenticare di eseguire il seguente nel terminale

composer dump-autoload 
+0

Sì avete perfettamente ragione, ho esaurito di opzioni in modo da Dovrò sostituire il fornitore di servizi. Anche se sono decisamente lieto che la sostituzione del fornitore di servizi sia un'opzione. Apprezzo davvero la risposta approfondita su questo –

Problemi correlati