Vit*_*Kos 7 php laravel laravel-4
我想用我自己的类来替换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;
}
}
Run Code Online (Sandbox Code Playgroud)
接下来我尝试在bootstrap/start.php文件中注册绑定,如下所示:
$app->bind('Illuminate\\Database\\Eloquent\\Builder', 'MyNameSpace\\Database\\Eloquent\\Builder');
return $app;
Run Code Online (Sandbox Code Playgroud)
Illuminate\Database\Eloquent\Builder
class是一个内部类,因此它不是注入Illuminate\Database\Eloquent\Model
类的依赖项,而是那种硬编码.
为了做你想做的事,我会扩展Illuminate\Database\Eloquent\Model
到MyNamespace\Database\Eloquent\Model
类和覆盖newEloquentBuilder
函数.
public function newEloquentBuilder($query)
{
return new MyNamespace\Database\Eloquent\Builder($query);
}
Run Code Online (Sandbox Code Playgroud)
然后别名MyNamespace\Database\Eloquent\Model
,以Eloquent
在aliases
中app/config/app.php
小智 5
这两个答案在某种程度上都是正确的。你必须决定你的目标是什么。
\n\n更改 Eloquent 构建器
\n\n例如,如果您只想为 eloquent 模型添加一个新方法(例如,类似作用域的东西,但可能更高级一点,所以它 \xe2\x80\x99s 在作用域中不可能)
\n\n创建一个扩展 Eloquent Builder 的新类,例如 CustomEloquentBuilder。
\n\nuse Illuminate\\Database\\Eloquent\\Builder;\n\n\nclass CustomEloquentBuilder extends Builder \n{\n\n public function myMethod()\n {\n // some method things\n }\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n创建自定义模型并覆盖方法newEloquentBuilder
\n\nuse Namespace\\Of\\CustomEloquentBuilder;\nuse Illuminate\\Database\\Eloquent\\Model;\n\n\nclass CustomModel extends Model\n{\n\n public function newEloquentBuilder($query)\n {\n return new CustomEloquentBuilder($query);\n }\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n更改数据库查询生成器
\n\n例如修改所有数据库访问的 where 子句
\n\n创建一个扩展数据库生成器的新类,例如 CustomQueryBuilder。
\n\nuse Illuminate\\Database\\Query\\Builder;\n\n\nclass CustomQueryBuilder extends Builder \n{\n\n public function myMethod()\n {\n // some method things\n }\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n创建自定义模型并覆盖方法newBaseQueryBuilder
\n\nuse Namespace\\Of\\CustomQueryBuilder;\nuse Illuminate\\Database\\Eloquent\\Model;\n\n\nclass CustomModel extends Model\n{\n\n protected function newBaseQueryBuilder()\n {\n $connection = $this->getConnection();\n\n return new CustomQueryBuilder(\n $connection, $connection->getQueryGrammar(), $connection->getPostProcessor()\n );\n }\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n\nLaravel 版本:5.5 / 此代码未经测试
\n