【发布时间】:2014-11-06 00:02:17
【问题描述】:
在 Laravel 中设置服务提供者时,我一直试图弄清楚 app->bind 和 app->singleton 之间的区别。我的印象是,如果我注册一个 singleton,每次调用它都会返回相同的对象实例,而 bind 将是一个新实例。
这是一个简单的例子:
立面:
use Illuminate\Support\Facades\Facade;
class DataFacade extends Facade
{
protected static function getFacadeAccessor() {
return 'Data';
}
}
服务提供者:
use Illuminate\Support\ServiceProvider;
class DataServiceProvider extends ServiceProvider
{
public function register() {
$this->app->singleton('Data', function() {
return new Data;
});
}
}
类:
class Data
{
public $data = [];
public function get($key)
{
return isset($this->data[$key]) ? $this->data[$key] : null;
}
public function set($key, $val)
{
$this->data[$key] = $val;
}
}
如果我们这样做:
$instance = App::make('Data');
$instance->set('foo', 'foo');
$instance2 = App::make('Data');
echo $instance->get('foo');
echo $instance2->get('foo');
然后运行,我们将看到bind 和singleton 之间的适当行为,foo 分别打印一次和两次。但是,如果我们像这样通过外观运行它:
Data::set('test', 'test');
Data::set('cheese', 'cheese');
当它是单例时,我希望 test 和 cheese 都可用,而当它是 bind 时,我不确定我希望通过门面获得什么,但似乎有没有区别。
是外观把所有东西都当作singleton?
【问题讨论】:
-
你已经知道区别了!
-
你提到了
bind——但你的问题从不直接调用bind。 -
但是门面不是调用调用bind的服务提供者吗?
-
@Rob 答案在下面——在 4.2 中(不知道早期版本),看起来门面调用了 $app[$service_name],而后者又调用了 make。更令人困惑的是,Facade 还有自己的单例存储层。
标签: laravel laravel-4 singleton facade