2014-11-19 14 views
5

Rozumiem, że domyślna klasa Eloquent\Collection może być zmieniona w modelu za pomocą metody:Rozszerzanie laravel Eloquent kolekcja Class

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

    return new CustomCollection($models); 
} 

który działa wspaniale, jeśli używam typowych zapytań takich jak:

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

to jest świetne, więc mogę dodać metody do klasy wymowny gromadzenia, takie jak:

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

$records->toTable(); 

Ale jeśli używam paginacji od modelu, na przykład:

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

Zwraca instancję klasy Illuminate\Support\Collection zamiast Illuminate\Database\Eloquent\Collection.

Czy istnieje sposób na przesłonięcie lub rozszerzenie typowego Illuminate\Support\Collection?

Próbuję dodać metodę toTable() do zwróconej kolekcji. Wolałbym nie zastąpić dostawcy usług paginacji swoim własnym.

Dzięki!

Odpowiedz

6

Konieczne będzie zastąpienie dostawcy usługi stronicowania wśród kilku innych klas w bibliotece stronicowania. Słysząc to, wiesz, jak to zrobić w ten sposób, ale liczyłeś na inną odpowiedź, ale ponieważ mam kod, wrzucę to tutaj dla ciebie.

Powodem, dla którego należy zastąpić te klasy/metody, jest fakt, że pliki w Iluminacja bezpośrednio odwołują się do wystąpień klas w przestrzeni nazw Iluminacja.

W config/app.php

Wymień

'Illuminate\Pagination\PaginationServiceProvider', 

Z

'ExtendedPaginationServiceProvider', 

Utwórz nowy plik gdzieś Autoloader jest zdolny do znalezienia go nazywa ExtendedPaginationServiceProvider.php i umieścić następujące w tym

<?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; 
     }); 
    } 
} 

Utwórz nowy plik gdzieś Autoloader jest zdolny do znalezienia go nazywa ExtendedPaginationFactory.php i umieść w nim następujące

<?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(); 
    } 
} 

utworzyć nowy plik gdzieś Autoloader jest zdolny do znalezienia go nazywa ExtendedPaginationPaginator.php i miejsce w nim:

<?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); 
    } 
} 

Zauważysz, że powyższe zwraca nowe wystąpienie ExtendedCollection. Zastąp ją oczywiście klasą CustomCollection, do której odwołujesz się w pytaniu.

dla innych odwołać, klasa ExtendedCollection może wyglądać podobnie do poniżej

utworzyć nowy plik gdzieś autoloaderze jest zdolny do znalezienia go nazywa ExtendedCollection.php i umieść w nim następujące

<?php 

use Illuminate\Support\Collection; 

class ExtendedCollection extends Collection 
{ 

} 

również po utworzeniu tych plików, nie zapomnij, aby uruchomić następujące polecenia w terminalu

composer dump-autoload 
+0

Yea masz całkowitą rację, ja zabrakło opcji więc Będzie musiał wymienić dostawcę usług. Chociaż zdecydowanie cieszę się, że zastąpienie usługodawcy jest opcją. Naprawdę doceniam głęboką odpowiedź na to –

Powiązane problemy