如何替换Laravel Builder类

时间:2014-05-05 14:43:29

标签: 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;
        }
    }

然后我尝试在bootstrap / start.php文件中注册绑定,如下所示:

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

3 个答案:

答案 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

中的Eloquentaliases别名改为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