2014-10-03 3 views
0

В yoyo.php:Laravel: Разрешение объектов из IoC контейнер

class Yoyo { 
    public $data; 
} 

В global.php:

App::singleton('yoyo', function() 
{ 
    return new Yoyo; 
}); 

В filters.php:

$a= App::make('yoyo'); 
$a->data = 'yep'; 

В контроллере:

public function doSomething() { 
    dd(App::make('yoyo')); 
} 

В filters.php, я могу получить доступ к собственности data и имеет ожидаемое значение.

В контроллере помощник dd показывает, что data является null.

Фильтр выполняется до вызова метода контроллера.

Почему именно $datanull?

+0

Я определил, что если я инициализирую $ data в классе, то это значение показывает вместо null. Поэтому я получаю новый экземпляр класса. Должен ли класс быть написан как синглтон или laravel заботится об этом для меня? – user44021

+0

Хорошо полная ошибка с моей стороны. Было перенаправление, поэтому контроллер фактически действовал по новому запросу, который не инициализировал yoyo. – user44021

ответ

0

Это из-за того, как Laravel загружает файлы. Сначала выполняется filters.php, а затем global.php, поэтому сначала вы создаете нормальный объект, а затем singleton. Если вы переезжаете:

$a= App::make('yoyo'); 
$a->data = 'yep'; 

к global.php после создания синглтона, вы получите результат, как и ожидалась:

объекта (Yoyo) # 247 (1) строки {[ "данные"] => (3) "yep"}

+0

Спасибо, но посмотри мой комментарий. Использование объекта фактически произошло во втором запросе и этот объект не инициализировался для него. – user44021

+0

@ user44021 Как я уже сказал, это потому, что вы используете 'App: make ('yoyo')' ПРЕЖДЕ ЧЕМ запустите Singleton. В этом случае вы создаете простой объект, и он не работает как Singleton. Вы должны установить любое значение ПОСЛЕ использования 'App :: singleton'. Как я уже сказал, вам нужно переместить этот код в 'global.php', чтобы он работал, как вы ожидаете. –

+0

@ user44021 Теперь я вижу. Вы должны использовать @ с кем-то именем, чтобы уведомить его о комментариях. –

0

Alright полная ошибка с моей стороны. Было перенаправление, поэтому контроллер фактически действовал по новому запросу, который не инициализировал yoyo.

Смежные вопросы