2014-05-05 16 views
5

Chcę zastąpić klasę budowniczych Laravels własną, która się przed nią rozszerza. Myślałem, że to będzie tak proste jak sprawa App::bind, ale wygląda na to, że nie działa. Gdzie powinienem umieścić wiązanie i jaki jest właściwy sposób, aby to zrobić w Laravel?Jak zamienić klasę Laravel Builder na klasę

To co próbowałem:

mój 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; 
     } 
    } 

A obok próbowałem zarejestrować wiązanie w bootstrap pliku/start.php tak:

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

Odpowiedz

7

Illuminate\Database\Eloquent\Builder klasa jest klasą wewnętrzną i jako taka nie jest zależnością wprowadzoną do klasy Illuminate\Database\Eloquent\Model, ale d twardego tam zakodowanego.

Aby zrobić to, co chcesz, rozszerzę klasę Illuminate\Database\Eloquent\Model na MyNamespace\Database\Eloquent\Model i zastąpię funkcję newEloquentBuilder.

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

Następnie alias MyNamespace\Database\Eloquent\Model do Eloquent na aliases w app/config/app.php

+0

bardzo nice.Thank cię –

1

Obie odpowiedzi są w pewien sposób poprawne. Musisz zdecydować, jaki jest twój cel.

Zmień Eloquent Builder

Na przykład, jeśli chcesz dodać nową metodę tylko dla modeli wymownych (np. Coś podobnego zakresów, ale może trochę bardziej zaawansowane, więc nie jest możliwe w zakresie)

Utwórz nową klasę rozszerzającą Eumquent Builder, na przykład CustomEloquentBuilder.

use Illuminate\Database\Eloquent\Builder; 


class CustomEloquentBuilder extends Builder 
{ 

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

} 

tworzenia własnego modelu i zastąpić metodę newEloquentBuilder

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


class CustomModel extends Model 
{ 

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

} 

Zmień Database Query Builder

Na przykład modyfikacji Where-klauzulę dla całej bazy danych dostęp

Utwórz nową klasę rozszerzającą bazę danych Bui lder, na przykład CustomQueryBuilder.

use Illuminate\Database\Query\Builder; 


class CustomQueryBuilder extends Builder 
{ 

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

} 

tworzenia własnego modelu i zastąpić metodę 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 Wersja: 5.5/Ten kod jest untestet