Laravel 4: Confused about how to use App::make()
Asked Answered
V

2

12

I am trying to follow the repository pattern outlined in this article http://code.tutsplus.com/tutorials/the-repository-design-pattern--net-35804#highlighter_174798 And I am trying to instantiate a class in Laravel using App::make() (Which I am guessing is Laravel's factory pattern?) and I am trying to parse arguments to my class but I can't work out how to do it.

Code:

namespace My;

class NewClass {
    function __construct($id, $title) 
    {
        $this->id = $id;
        $this->title = $title;
    }
}

$classArgs = [
    'id'    => 1,
    'title' => 'test',
]

$newClass = App::make('My\NewClass', $classArgs);

Can anyone point to an example of how to use App::make() or have I gone in the completely wrong direction and shouldn't be using App::make()?

Vesical answered 10/2, 2014 at 15:12 Comment(0)
V
10

The good people in the Laravel forum answered this one for me http://laravel.io/forum/02-10-2014-laravel-4-confused-about-how-to-use-appmake

Pretty much if you can bind custom instantiation code with App::bind(); like so

App::bind('My\NewClass', function() use ($classArgs) {
    return new My\NewClass($classArgs['id'], $classArgs['title']);
});

// get the binding
$newClass = App::make('My\NewClass');
Vesical answered 12/2, 2014 at 9:35 Comment(0)
S
18

App is actually a facade for Laravel IoC container usually used for automatic resolution. Understanding of IoC concept is vital for complex application development but small projects will benefit from well architecture for sure. I would recommend to dive into Laravel documentation first and try some examples on Service Providers, Bindings and Automatic Resolution.

Speaking about your example:

namespace My;

class NewClass {

    function __construct($id, $title) 
    {
        $this->id    = $id;
        $this->title = $title;
    }
}


$newClass = App::make('My\NewClass', [1, 'test']);
Selfpronouncing answered 10/2, 2014 at 17:24 Comment(6)
Thanks for your reply. So you wouldn't use App::make() to pass an array of arguments, because that seems to be the functionality of View::make('SomeView', $args);Vesical
Sure. I would say its more for structuring application and adding some level of abstraction. For example I use it to resolve interfaces (bound in service provider). App::make('My\ClassInterface');Selfpronouncing
Whats the benefit of it? whats the difference if i use new NewClass(1, 'test')Hamner
@BrandGuy it's fine to use new Class but that will return a new instance everytime. App::make returns the same instance.Casals
@RajaKhoury Got it, it's a singleton then. Thanks.Hamner
@BrandGuy I guess my comment is not entirely correct. Look here make method . This method resolves the class from the container and it doesn't imply it is a singleton. See here docs you can do a normal binding ( return a new instance every time) or a singleton binding ( return the same instance) and both can be resolved using App::make or resolve(..)Casals
V
10

The good people in the Laravel forum answered this one for me http://laravel.io/forum/02-10-2014-laravel-4-confused-about-how-to-use-appmake

Pretty much if you can bind custom instantiation code with App::bind(); like so

App::bind('My\NewClass', function() use ($classArgs) {
    return new My\NewClass($classArgs['id'], $classArgs['title']);
});

// get the binding
$newClass = App::make('My\NewClass');
Vesical answered 12/2, 2014 at 9:35 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.