Diferença do Laravel `entre app-> bind` e` app-> singleton`?
Eu tenho tentado descobrir qual é a diferença entreapp->bind
eapp->singleton
são ao configurar um provedor de serviços no Laravel. Fiquei com a impressão de que se eu registrar umsingleton
retornaria a mesma instância do objeto toda vez que fosse chamado vsbind
o que seria uma nova instância.
Aqui está um exemplo simples:
Fachada:
use Illuminate\Support\Facades\Facade;
class DataFacade extends Facade
{
protected static function getFacadeAccessor() {
return 'Data';
}
}
Provedor de serviço:
use Illuminate\Support\ServiceProvider;
class DataServiceProvider extends ServiceProvider
{
public function register() {
$this->app->singleton('Data', function() {
return new Data;
});
}
}
Classe:
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;
}
}
Se fizermos algo como:
$instance = App::make('Data');
$instance->set('foo', 'foo');
$instance2 = App::make('Data');
echo $instance->get('foo');
echo $instance2->get('foo');
E corra que veremos o comportamento apropriado entrebind
esingleton
comfoo
sendo impresso uma e duas vezes, respectivamente. No entanto, se passarmos pela fachada da seguinte forma:
Data::set('test', 'test');
Data::set('cheese', 'cheese');
Quando é um singleton, eu esperaria que ambostest
echeese
estar disponível e quando é umbind
Não tenho certeza do que eu esperava estar disponível pela fachada, mas parece que não há diferença.
É a fachada tratando tudo como umsingleton
?