我希望将Laravels构建器类替换为我自己的类。我认为它会像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;
答案 0 :(得分:8)
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
Eloquent
将aliases
别名改为app/config/app.php
答案 1 :(得分:3)
上面的答案并不适用于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());
}
答案 2 :(得分:2)
这两个答案在某些方面都是正确的。你必须决定你的目标是什么。
更改Eloquent Builder
例如,如果您只想为雄辩的模型添加一个新方法(例如像示波器这样的东西,但可能更高级,因此在范围内是不可能的)
创建一个扩展Eloquent Builder的新类,例如CustomEloquentBuilder。
use Illuminate\Database\Eloquent\Builder;
class CustomEloquentBuilder extends Builder
{
public function myMethod()
{
// some method things
}
}
创建自定义模型并覆盖方法 newEloquentBuilder
use Namespace\Of\CustomEloquentBuilder;
use Illuminate\Database\Eloquent\Model;
class CustomModel extends Model
{
public function newEloquentBuilder($query)
{
return new CustomEloquentBuilder($query);
}
}
更改数据库查询生成器
例如,修改所有数据库访问的where子句
创建一个扩展Database Builder的新类,例如CustomQueryBuilder。
use Illuminate\Database\Query\Builder;
class CustomQueryBuilder extends Builder
{
public function myMethod()
{
// some method things
}
}
创建自定义模型并覆盖方法 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版本:5.5 /此代码是untestet