Мотив 1
Некоторые пакеты должны.
Обычно вы увидите, как ServiceProviders используют его следующим образом:
$this->app['db']
Или внутри привязки закрытия:
$this->app->bindShared('anything', function($app)
{
return new DatabaseClass($app['db']->connection());
});
Потому что $app
является свойством Illuminate\Support\ServiceProvider
, а ServiceProviders — это ребята, которые загружают сервисы, которые будут использоваться Facades в вашем приложении.
Итак, сначала Laravel создаст экземпляр и загрузит всех ServiceProviders, которые предоставляют службу, связанную с IoC, например:
$this->app->bindShared('db', function($app)
{
return new DatabaseManager($app, $app['db.factory']);
});
И после этого конкретного звонка у вас есть доступ к Фасаду:
DB::table(...);
До этого вы получаете сообщение об ошибке, сообщающее вам, что нет привязки «db».
И я должен подчеркнуть, что вы в основном увидите, что это используется в ServiceProviders таким образом, потому что замыкание предоставляет переменную $app
, чтобы использовать его таким образом:
$app['db']->connection()...
Конечно, любой может получить привязку IoC для приложения и установить для нее переменную $app
...
Мотив 2
Некоторые другие могут злоупотреблять этим, чтобы не сломать свои пакеты. Полагаться на псевдоним, чтобы ваш пакет работал, опасно, потому что, если пользователь изменит этот псевдоним, пакет может сломаться. Это может быть проблемой пользователя, но это также создаст для них некоторые проблемы, например, проблемы на Github.
person
Antonio Carlos Ribeiro
schedule
04.12.2013