В чем преимущество режима поставщика услуг? - PullRequest
0 голосов
/ 04 апреля 2019

прежде всего, я видел много кода, чтобы доказать, что поставщик услуг, но у меня все еще есть некоторые проблемы

пример кода:

<?php

namespace App\Http\Controllers\Test;


use App\Http\Controllers\Controller;

class Test extends Controller
{
    // simple case
    public function __construct(\SomeClass $class)
    {
        $this->class = $class;
    }
    // vs
    public function __construct()
    {
        $this->class = new \SomeClass();
    }

Большая часть кода, который я видел, говорит, что класс сложный:

    public function __construct()
    {
        $this->class = new \SomeClass(new Bar(), new Foo('other dependence'));
    }
    // then they said provider can solve it like:
    $this->app->bind('SomeClass', function(){
        return new \SomeClass(new Bar(), new Foo('other dependence'));
    });
    // and use like follow:
    public function __construct(\SomeClass $class)
    {
        $this->class = $class;
    }

}

Итак, мой вопрос:

если класс необходим для получения экземпляра

почему бы не сделать то же самое (создать новый экземпляр) в SomeClass, Bar и Foo, например:

class SomeClass
{
    public function __construct()
    {
        $this->bar = new Bar();
        $this->foo = new Foo();
    }
}

class Bar
{
    public function __construct()
    {
    }
}

class Foo
{
    public function __construct()
    {
        $this->other_dep = new OtherDependence();
    }
}

тогда я все еще могу закодировать, как написано:

public function __construct()
{
    $this->class = new \SomeClass();
    // now it's equal to
    // $this->class = new \SomeClass(new Bar(), new Foo('other dependence'));
}

1 Ответ

0 голосов
/ 04 апреля 2019

В случае $this->app->bind это скажет Laravel, как создать экземпляр класса, когда вы освободите его от contsructor __construct(\SomeClass $class) или app('SomeClass') или resolve('SomeClass').Если у вас нет сложных зависимостей для класса, я бы остановился на $this->class = new \SomeClass();, потому что SomeClass не требует создания каких-либо других объектов.Когда вы делаете __construct(\SomeClass $class), это автоматически разрешает любые зависимости, которые достаточно просты для того, чтобы Laravel отображал себя, например, имена классов, а не интерфейсы.

...