2014-10-03 100 views
0

对象在yoyo.phpLaravel:解决从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。所以我得到了一个新的班级实例。班级必须写成单身还是拉拉维尔为我照顾? – user44021 2014-10-03 04:58:02

+0

好吧,我完全错误。有一个重定向,所以控制器实际上正在执行一个新的请求,一个没有初始化yoyo。 – user44021 2014-10-03 05:53:51

回答

0

这是因为Laravel如何加载文件。首先执行filters.php,然后global.php先创建普通对象,然后创建单例。如果移动:

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

global.php创建单之后,你会得到结果如预期:

对象(溜溜球)#247(1){[ “数据”] =>串(3 )“yep”}

+0

谢谢,但看到我的评论。对象的使用实际上发生在第二个请求中,并且该对象未初始化。 – user44021 2014-10-03 19:29:22

+0

@ user44021正如我所说,这是因为您使用'App:make('yoyo')'运行Singleton之前。在这种情况下,你创建一个简单的对象,它不能用作Singleton。您需要在使用App :: singleton后设置任何值。正如我所说的,你需要将这段代码移动到'global.php'中,以使其正常工作,如你所愿 – 2014-10-03 19:34:47

+0

@ user44021现在我明白了。你应该用@和某人的名字通知他评论。 – 2014-10-03 20:29:19

0

好吧,我完全犯错了。有一个重定向,所以控制器实际上正在执行一个新的请求,一个没有初始化yoyo。