如何替换Laravel Builder类

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)

tha*_*max 9

Illuminate\Database\Eloquent\Builderclass是一个内部类,因此它不是注入Illuminate\Database\Eloquent\Model类的依赖项,而是那种硬编码.

为了做你想做的事,我会扩展Illuminate\Database\Eloquent\ModelMyNamespace\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,以Eloquentaliasesapp/config/app.php


小智 5

这两个答案在某种程度上都是正确的。你必须决定你的目标是什么。

\n\n

更改 Eloquent 构建器

\n\n

例如,如果您只想为 eloquent 模型添加一个新方法(例如,类似作用域的东西,但可能更高级一点,所以它 \xe2\x80\x99s 在作用域中不可能)

\n\n

创建一个扩展 Eloquent Builder 的新类,例如 CustomEloquentBuilder。

\n\n
use 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\n
use 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\n
use 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\n
use 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\n

Laravel 版本:5.5 / 此代码未经测试

\n