Vit Kos Vit Kos - 4 months ago 23
PHP Question

How to replace the Laravel Builder class

I want to replace the Laravels builder class with my own that's extending from it. I thought it would be as simple as matter of

App::bind
but it seems that does not work. Where should I place the binding and what is the proper way to do that in Laravel?

This is what I have tried:

my Builder:

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;
}
}


And next I tried to register the binding in bootstrap/start.php file like this :

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

Answer

Illuminate\Database\Eloquent\Builder class is an internal class and as such it is not dependency injected into the Illuminate\Database\Eloquent\Model class, but kind of hard coded there.

To do what you want to do, I would extend the Illuminate\Database\Eloquent\Model to MyNamespace\Database\Eloquent\Model class and override newEloquentBuilder function.

public function newEloquentBuilder($query)
{
   return new MyNamespace\Database\Eloquent\Builder($query);
}

Then alias MyNamespace\Database\Eloquent\Model to Eloquent at the aliases in app/config/app.php

Comments