我一直在尝试弄清楚在Laravel中设置服务提供者时app->bind
和app->singleton
之间的区别。 我的理解是,如果我注册一个singleton
,每次调用它都会返回同一个对象实例,而bind
则会返回一个新实例。
这里是一个简单的示例:
Facade:
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
。 - Alana Storm