Модели саморегуляции вызывают максимальный уровень гнездования функции x в Laravel 4

Я работаю над достаточно крупным проектом Laravel и использую репозитории.

У меня есть пользовательский репозиторий, который вводит свои зависимости так:

public function __construct(CartRepository $cartRepo...) 

Это вызывает следующую ошибку:

 Maximum function nesting level of '100' reached, aborting! 

Я думаю, это связано с тем, что CartRepo вводит ItemRepo, который, в свою очередь, вводит UserRepo, вызывая бесконечный цикл вложенности.

То, что я не получаю, так это то, как найти это, ItemRepo нуждается в UserRepo, поскольку элементы привязаны к пользователю?

Кто-нибудь сталкивался с этим раньше? Если да, то как вы обошли это?

Я знаю, что могу увеличить xdebug.max_nesting_level но даже при значении 750 он все еще бросает ошибку, я бы также исправил основную проблему, чем просто ее похоронить.

У вас есть цикл в вашем графике зависимостей:

 UserRepo -> CartRepo -> ItemRepo -> UserRepo -> … 

Вы не можете это разрешить. Это бесконечный цикл, xdebug.max_nesting_level вам не поможет.

Я просто удивлен тем, что контейнер Laravel DI не бросает явного исключения.

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


Обновление : Woops, я забыл о нескольких решениях!

  • Сетчатая инъекция

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

 $userRepo = new UserRepository(); $cartRepo = new CartRepository($userRepo); $userRepo->setCartRepo($userRepo); 
  • Ленивая инъекция

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

Для тех, кто достигает этого ответа и все еще немного не уверен, что делать, как я, я просто хотел поделиться своим решением. Решение Маттие верно, но для начинающего, как и я, он все же не дал мне конкретного ответа на фактическое решение циклической зависимости. В конце концов я пришел к выводу, что мои классы были слишком большими и что их разбить на более мелкие классы, даже классы с помощью одного метода были ответом. Например, если у вас есть класс User, который содержит метод входа и метод регистрации, а затем некоторый другой класс, скажем, Social Class, который использует метод входа в систему пользовательского класса и по какой-либо причине пользовательский класс имеет зависимость от социального класса то моим решением было бы переместить метод входа в свой класс, который не имел бы никаких зависимостей. Таким образом, класс Social теперь использует класс Login, который не имеет никаких зависимостей. В целом я пошел от 3 классов до 9, и это полностью решило проблему для меня. Я думаю, что этот тип мышления интуитивно понятен для новичков, но если вы не знаете, чего не знаете, это может быть жестким.

Причиной вашей ошибки может быть ошибка в Laravel, но в настоящее время я работаю с symfony2, и symfony2 сделал то же самое (на сущности класса, например) без проблем. Каким бы ни был установлен параметр php.ini max_nesting_level (по умолчанию 64), или если вы используете xdebug.max_nesting_level установите xdebug.max_nesting_level . Сначала попробуйте последнее предложение …