php - Laravel 4 setting up model using the IoC container -
i watched video , wanted change laravel controllers had dependencies managed laravel's ioc container. video talks creating interface model , implementing interface specific data source used.
my question is: when implementing interface class extends eloquent , binding class controller accessible $this->model
, should create interfaces , implementations eloquent models may returned when calling methods such $this->model->find($id)
? should there different classes model , modelrepository?
put way: how do new model
when model in $this->model
.
generally, yes, people doing pattern (the repository pattern) have interface have methods defined app use:
interface somethinginterface { public function find($id); public function all(); public function paged($offset, $limit); }
then create implementation of this. if you're using eloquent, can make eloquent implementation
use illuminate\database\model; class eloquentsomething { protected $something; public function __construct(model $something) { $this->something = $something; } public function find($id) { return $this->something->find($id); } public function all() { ... } public function paged($offset, $limit) { ... } }
then make service provider put together, , add app/config/app.php
.
use something; // eloquent model use namespace\path\to\eloquentsomething; use illuminate\support\serviceprovider; class reposerviceprovider extends serviceprovider { public function register() { $app = $this->app; $app->bind('namespace/path/to/somethinginterface', function() { return new eloquentsomething( new ); }); } }
finally, controller can use interface type hint:
use namespace/path/to/somethinginterface; class somethingcontroller extends basecontroller { protected $something; public function __construct(somethinginterface $something) { $this->something = $something; } public function home() { return $this->something->paged(0, 10); } }
that should it. apologies on errors, isn't tested, lot.
downsides:
more code :d
upsides:
- able switch out implementations (instead of eloquentsomething, can use arraysomething, mongosomething, whatever), without changing controller code or code uses implementation of interface.
- testable - can mock eloquent class , test repository, or mock constructor dependency , test controller
- re-usable - can
app::make()
concrete eloquentsomething anywhere in app , re-use repository anywhere in code - repository place add additional logic, layer of cacheing, or validation rules. stock mucking in controllers.
finally:, since typed out , still didn't answer question (wtf?!), can new instance of model using $this->model
. here's example creating new something:
// interface: public function create(array $data); // eloquentsomething: public function create(array $data) { $something = this->something->newinstance(); // continue on creation logic }
key method, newinstance().
Comments
Post a Comment