2014-05-05 13 views
5

Voglio sostituire la classe di build Laravels con la mia che si sta estendendo da essa. Ho pensato che sarebbe stato semplice come lo App::bind ma sembra che non funzioni. Dove dovrei posizionare la rilegatura e qual è il modo corretto di farlo in Laravel?Come sostituire la classe Laravel Builder

Questo è quello che ho provato:

mia Builder:

use Illuminate\Database\Eloquent\Builder as BaseBuilder; 
    class Builder extends BaseBuilder 
    { 

     /** 
     * Find a model by its primary key. 
     * 
     * @param mixed $id 
     * @param array $columns 
     * @return \Illuminate\Database\Eloquent\Model|static|null 
     */ 
     public function find($id, $columns = array('*')) 
     { 
      Event::fire('before.find', array($this)); 
      $result = parent::find($id, $columns); 
      Event::fire('after.find', array($this)); 
      return $result; 
     } 
    } 

E dopo ho provato a registrare il legame nel file di bootstrap/start.php come questo:

$app->bind('Illuminate\\Database\\Eloquent\\Builder', 'MyNameSpace\\Database\\Eloquent\\Builder'); 
return $app; 

risposta

7

Illuminate\Database\Eloquent\Builder classe è una classe interna e come tale non è stata inserita nella classe Illuminate\Database\Eloquent\Model, ma parenti d di codice fisso lì.

Per fare ciò che si desidera fare, estenderei la classe Illuminate\Database\Eloquent\Model a MyNamespace\Database\Eloquent\Model e sostituisco la funzione newEloquentBuilder.

public function newEloquentBuilder($query) 
{ 
    return new MyNamespace\Database\Eloquent\Builder($query); 
} 

Poi alias MyNamespace\Database\Eloquent\Model al Eloquent al aliases in app/config/app.php

+0

molto si nice.Thank –

1

Entrambe le risposte sono corrette in qualche modo. Devi decidere qual è il tuo obiettivo.

Change Eloquente Builder

Ad esempio, se si desidera aggiungere un nuovo metodo solo per i modelli eloquenti (ad es. Una cosa del genere ambiti, ma forse un po 'più avanzato, quindi non è possibile in un campo di applicazione)

Creare una nuova classe estendendo il generatore Eloquent, ad esempio CustomEloquentBuilder.

use Illuminate\Database\Eloquent\Builder; 


class CustomEloquentBuilder extends Builder 
{ 

    public function myMethod() 
    { 
     // some method things 
    } 

} 

creare un modello personalizzato e sovrascrivere il metodo newEloquentBuilder

use Namespace\Of\CustomEloquentBuilder; 
use Illuminate\Database\Eloquent\Model; 


class CustomModel extends Model 
{ 

    public function newEloquentBuilder($query) 
    { 
     return new CustomEloquentBuilder($query); 
    } 

} 

Cambia database Query Builder

Ad esempio, per modificare la clausola where per tutti i database accessi

Creare una nuova classe estendendo il database Bui lder, per esempio CustomQueryBuilder.

use Illuminate\Database\Query\Builder; 


class CustomQueryBuilder extends Builder 
{ 

    public function myMethod() 
    { 
     // some method things 
    } 

} 

creare un modello personalizzato e sovrascrivere il metodo newBaseQueryBuilder

use Namespace\Of\CustomQueryBuilder; 
use Illuminate\Database\Eloquent\Model; 


class CustomModel extends Model 
{ 

    protected function newBaseQueryBuilder() 
    { 
     $connection = $this->getConnection(); 

     return new CustomQueryBuilder(
      $connection, $connection->getQueryGrammar(), $connection->getPostProcessor() 
     ); 
    } 

} 

laravel Versione: 5.5/questo codice è untestet

Problemi correlati