Как заменить класс Laravel Builder

Я хочу заменить класс Laravels builder своим собственным, который простирается от него. Я думал, что это будет так же просто, как вопрос App::bind но кажется, что это не работает. Где я должен разместить привязку и как правильно это сделать в Laravel?

Вот что я пробовал:

мой строитель :

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

Затем я попытался зарегистрировать привязку в файле bootstrap / start.php следующим образом:

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

Класс Illuminate\Database\Eloquent\Builder является внутренним классом и, как таковой, он не является интродуцированным в класс Illuminate\Database\Eloquent\Model классом, но там вроде жестко закодирован.

Чтобы сделать то, что вы хотите сделать, я бы расширить класс Illuminate\Database\Eloquent\Model до MyNamespace\Database\Eloquent\Model и переопределить функцию newEloquentBuilder .

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

Затем псевдоним MyNamespace\Database\Eloquent\Model to Eloquent на aliases в app/config/app.php

Ответ выше не подходит для laravel> 5, поэтому я сделал кое-что, и я нашел это!

https://github.com/laravel/framework/blob/5.2/src/Illuminate/Database/Eloquent/Model.php#L1868

используйте это вместо этого!

 protected function newBaseQueryBuilder() { $conn = $this->getConnection(); $grammar = $conn->getQueryGrammar(); return new QueryBuilder($conn, $grammar, $conn->getPostProcessor()); }