Передайте класс через config, используя :: class, и получите в Laravel - PullRequest
0 голосов
/ 15 декабря 2018

У меня есть файл конфигурации с таким массивом:

'ppr' => [
    'validate' => TestRequest::class
];

Теперь я хочу получить этот класс в другой части системы и использовать его для проверки формы (вне контроллера).

При использовании config('main.ppr.validate') все, что я получаю, это имя класса в пространстве имен вместо объекта класса.

Поскольку я уже признал, что просто использовать запросы повторно будет не так просто, как в контроллерах, я все еще удивляюсь, как передать класс с помощью конфигурации.При прохождении красноречивых моделей он работает как шарм (или, например, массивы конфигурации с промежуточным программным обеспечением и т. Д.), Поэтому я полагаю, что существует некоторая магическая привязка к IoC для достижения этого, правда ли это?

У меня вопрос, как использовать класс, переданный, как в примере выше без , инициализируя его следующим образом:

$obj = new $className;

1 Ответ

0 голосов
/ 15 декабря 2018

Laravel (и многие другие приложения) используют Внедрение зависимостей для достижения этой магии - ваши слова, а не мои!: D

Кажется, что Service Container - это то, что обрабатывает это в Laravel и должно помочь вам.

Непосредственно из документов Laravel (ссылка выше):

Внутри поставщика услуг у вас всегда есть доступ к контейнеру через свойство $ this-> app.Мы можем зарегистрировать привязку, используя метод bind, передавая имя класса или интерфейса, которое мы хотим зарегистрировать, вместе с Closure, который возвращает экземпляр класса:

$this->app->bind('HelpSpot\API', function ($app) {
    return new HelpSpot\API($app->make('HttpClient'));
});

Также:

Вы можете использовать метод make для разрешения экземпляра класса из контейнера.Метод make принимает имя класса или интерфейса, который вы хотите разрешить:

$api = $this->app->make('HelpSpot\API');

И:

Если некоторые зависимости вашего класса не могут быть разрешены с помощьюконтейнер, вы можете вставить их, передав их как ассоциативный массив в метод makeWith:

$api = $this->app->makeWith('HelpSpot\API', ['id' => 1]);

ИМХО, я бы посмотрел, где и как это реализовано в нативном Laravelкод (обычно поставщик Illuminate) и посмотрите, как он используется / предназначен для реализации.


Кроме того, ClassName::class вернет пространство имен + класс этого класса.Вот почему вы видите только имя класса и фактически не получаете объект / экземпляр этого класса.

Я не уверен, что / где / почему / как вы реализуете свой класс и зачем вам это нужноэта функциональность где-то, что он еще не существует.Laravel очень хорош в том, что уже настроил вещи там, где они вам нужны, так что подумайте дважды, прежде чем выходить из коробки, и убедитесь, что для вашей ситуации не существует решения по умолчанию!

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