Я хочу заменить класс 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()); }