【问题标题】:Laravel: Resolving Objects from the IoC ContainerLaravel:从 IoC 容器中解析对象
【发布时间】:2014-10-03 01:05:31
【问题描述】:

yoyo.php:

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

【问题讨论】:

  • 我确定如果我在类中初始化 $data,则显示该值而不是 null。所以我得到了这个类的一个新实例。类必须写成单例还是 laravel 会为我处理?
  • 好吧,完全是我的错误。有一个重定向,所以控制器实际上是在处理一个新的请求,一个没有初始化 yoyo。

标签: php laravel ioc-container


【解决方案1】:

这是因为 Laravel 加载文件的方式。首先执行filters.php,然后执行global.php,因此首先创建普通对象,然后创建单例。如果你搬家:

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

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

object(Yoyo)#247 (1) { ["data"]=> string(3) "yep" }

【讨论】:

  • 谢谢,但请参阅我的评论。该对象的使用实际上发生在第二个请求中,并且该对象没有为它初始化。
  • @user44021 正如我所说,这是因为您在运行 Singleton 之前使用了 App:make('yoyo')。在这种情况下,您创建一个简单的对象,它不能作为 Singleton 工作。您需要在使用App::singleton 之后设置任何值。正如我所说,您需要将此代码移至 global.php 以使其按预期工作
  • @user44021 现在我明白了。你应该使用@和某人的名字来通知他评论。
【解决方案2】:

好吧,完全是我的错误。有一个重定向,所以控制器实际上是在处理一个新的请求,一个没有初始化 yoyo。

【讨论】:

    猜你喜欢
    • 2016-10-01
    • 2014-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多