Container :: getAlias ​​($ abstract) выдает ErrorException: недопустимый тип смещения в isset или пустой, если $ abstract отсутствует в $ this- ›aliases []

  • Версия Laravel: 5.6.16
  • Версия PHP: 7.2.3
  • Драйвер и версия базы данных: N / A

Описание:

laravel \ framework \ src \ Illuminate \ Container \ Container.php общедоступная функция getAlias ​​($ abstract) выдает ErrorException: недопустимый тип смещения в isset или пустой, если $ abstract отсутствует в $ this-> aliases []

$ this-> aliases [$ abstract] имеет значение null, а! isset ($ this-> aliases [$ abstract]) выдает ErrorException: недопустимый тип смещения в isset или пустой

$ абстрактное значение: Modules \ Administration \ Tests \ Commands \ StubJsonCommandHandler

Действия по воспроизведению:

Запустите AdministrationControllerTest (https://github.com/proyectotau/TAU/ клон ветки laraveldusk [4ef9b0e124657abed7afde0969f3328bf7be95a)

Это ошибка или у меня есть ошибка? Заранее спасибо!


person user2928048    schedule 06.05.2018    source источник


Ответы (3)


При привязке экземпляра к контейнеру убедитесь, что вы используете:

app()->instance('dependency', $instantiation);

нет,

app()->bind('dependency', $instantiation); // DON'T bind an instance

Попытка привязать экземпляр приведет к ошибке, поскольку контейнер пытается проиндексировать возможные псевдонимы, используя конкретный объект, а не тип.

person Taurai Benhura    schedule 30.09.2019

Обходной путь

Изменение функции getAlias ​​() ! isset($this->aliases[$abstract]) для ! isset($this->aliases[(string)$abstract])

Или явно измените type-hint на string для ВСЕХ функций (@param string недостаточно) public function getAlias($abstract) для public function getAlias(string $abstract)

Но это не удается позже при следующем использовании [$ abstract] в Container: isShared() at isset($this->instances[(string)$abstract]) isset($this->bindings[(string)$abstract] resolve() calling to$this->resolved[(string)$abstract] = true; getConcrete() at if (isset($this->bindings[(string)$abstract])) getContextualConcrete() at if (empty($this->abstractAliases[(string)$abstract])) getExtenders() at if (isset($this->extenders[(string)$abstract])) и в Illuminate \ Foundation \ Application: make() at if (isset($this->deferredServices[(string)$abstract]) && ! isset($this->instances[(string)$abstract]))

PS: ознакомьтесь с комментарием Альваро Гонсалеса в php - Как исправить эту ошибку недопустимого типа смещения

person user2928048    schedule 06.05.2018

Наконец я обнаружил, что проблема заключалась в отправке таких параметров, как :: class, которые нельзя использовать в качестве индекса массива. Вместо этого должны быть струны

person user2928048    schedule 02.08.2018