Laravel 5 - Как использовать $ this-> app-> when () - PullRequest
0 голосов
/ 12 октября 2018

Чтение о связях laravel , я понимаю $this->app->bind, $this->app->singleton и $this->app->instance, потому что они почти одинаковы.

Но $this->app->when немного сложно дляme.

В примере с laravel

$this->app->when('App\Http\Controllers\UserController')
          ->needs('$variableName')
          ->give($value);

В моем понимании он вводит некоторое примитивное значение, а App\Http\Controllers\UserController является псевдонимом объекта, который будет связан. Но где находится объект?

Кто-нибудь может объяснить?Спасибо за вашу помощь.

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

Контекстное связывание работает не с именами переменных, а с типами.Он используется для предоставления различных реализаций интерфейсов к потребляющим классам или функциям, в зависимости от контекста.Фактически, вы можете фактически прочитать вызовы метода, и он делает именно то, что вы ожидаете.Чтобы уточнить это, я возьму пример документации и немного его адаптирую:

$this->app->when(Worker::class)
          ->needs(Money::class)
          ->give(function () {
              return new Dollar();
          });

$this->app->when(Boss::class)
          ->needs(Money::class)
          ->give(function () {
              return new Cheque();
          });

В этом примере Money - это интерфейс, а Cents и Cheque - реализации.интерфейса.Пример буквально означает, что если вы напечатаете подсказку Money в классе Worker, он будет преобразован в экземпляр Dollar, а в Boss - в Cheque.Чтобы проиллюстрировать, здесь реализации и результаты:

interface Money
{
    public function getAmount();
}

class Dollar implements Money
{
    public function getAmount()
    {
        return 1;
    }
}

class Cheque implements Money
{
    public function getAmount()
    {
        return 100000;
    }
}

А теперь мы набираем подсказку интерфейса Money, чтобы увидеть, что мы получим:

class Worker
{
    public function __construct(Money $money)
    {
        echo $money->getAmount(); // prints '1'
    }
}

class Boss
{
    public function __construct(Money $money)
    {
        echo $money->getAmount(); // prints '100000'
    }
}
0 голосов
/ 12 октября 2018

Это означает, что если создается экземпляр класса UserController и ему нужна переменная с именем $variableName Larvel автоматически разрешит эту переменную с заданным значением, и вам не нужно ее предоставлять.

Например:

$value = "Sven"
$this->app->when('App\Http\Controllers\UserController')
          ->needs('$userName')
          ->give($value);

Это вставит значение 'Sven' в UserController всякий раз, когда ему понадобится переменная с именем $userName

Другими словами, если у вас естьфункция типа public function __construct(Request $request) Laravel знает, что вставить, потому что знает, что ожидается объект Request.Когда вы используете такую ​​функцию, как public function __construct($name) Laravel не имеет ни малейшего представления о том, что здесь вставлять, по сути вы говорите Laravel, как разрешить эту переменную с помощью привязок.

Это пример примитивного связывания , для контекстной привязки см. ответ @ Namoshek

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...