2013-12-03 4 views
1

При просмотре некоторого исходного кода на Github я заметил, что некоторые пакеты используют сам контейнер приложения для доступа к IOC, а не к Facades. Почему вы используете что-то вроде этого ...

$app = app(); 
$user = $app['db']->connection()->table('users')->where('name', '=', 'Foo')->first(); 

... вместо этого?

$user = User::where('name', '=', 'Foo')->first(); 

ответ

5

Motive 1

Некоторые пакеты должны.

Обычно вы будете видеть ServiceProviders, используя его таким образом:

$this->app['db'] 

Или внутри крышки связывания:

$this->app->bindShared('anything', function($app) 
{ 
    return new DatabaseClass($app['db']->connection()); 
}); 

Поскольку $app является собственностью Illuminate\Support\ServiceProvider и ServiceProviders ребята, которые загрузиться которые будут использоваться Фасадами в вашем приложении.

Итак, первый 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.

+0

Антонио Карлос Рибейро, вы бы использовали Fascades при создании пакета или использовали бы приложение $? Как в контроллерах и командах? – searsaw

+0

При создании пакета я бы использовал $ app в ServiceProvider, и я бы также создал для него Facade. Фасады - это фантастический и прекрасный способ облегчить доступ к вашему пакету, но они просто ярлык, поэтому пользователям не нужно создавать их все время. –

0

Просто чтобы добавить что-нибудь к этому ответу.

Есть несколько типов псевдонимов, с помощью которых поставщики могут быть решены из IoC:

  • Ahort псевдонимов, которые связаны непосредственно с контейнером (этот список может быть найден в Illuminate \ Foundation \ Application .php файла) .eg $ приложение [ «дб»]

    псевдонимов, что фасады используют для «статического» (этот список можно найти в приложении/Config/app.php файл например ,View :: сделать ("индекс");

    И вы можете связываться с методом AliasLoader :: getInstance().

Это было запутанным для меня, потому что некоторые статические псевдонимы имена отличаются от их короткого имени поставщика. Например, красноречивые точки для Accessor Model и Route facade - это маршрутизатор (а не маршрут). Или config, который не привязан к IoC через своего поставщика услуг - он указывает на класс репозитория в файле Application.php. Таким образом, нам предоставляется гибкая гибкость через эти простые шаблоны.

Смежные вопросы