Добрый день!
Чем больше я читаю, тем больше я запутываюсь в этом. В чем разница между фасадом и псевдонимами?
У меня есть этот класс:
/app/libraries/Project/Data.php
namespace PJ;
class Data {
// It is much like a data container, with static methods and properties for saving info
}
И соответствующий фасад, так что я могу получить доступ, используя только ПСР :: .
Согласно какой-то веб-странице:
… Фасады Laravel — это прокси. Они оборачиваются и вызывают функции
на основную истинную реализацию кода. Далее в
В контексте приложения Laravel эти Фасады доступны
присваивая их псевдонимам. Это использование Dependency Injection
Контейнер позволяет ссылаться на что-то вроде
Осветите \ Support \ Facades \ Filesystem, просто вызвав File.
(http://ryantablada.com/post/proxies-service-locators-alias-facades-and-war)
Но я также нашел и успешно протестировал это добавление чего-то вроде:
__app / конфигурации / app.php__
'aliases' => array(
//....,
'PJD' => 'PJ\Data',
),
Я также могу получить доступ к своему классу таким же образом.
Так в чем же разница?
Спасибо
РЕДАКТИРОВАТЬ # 01
Я создал класс с именем Data в /app/libraries/Project/Data.php
namespace PJ;
class Data {
// It is much like a data container, with static methods and properties for saving info
}
У меня есть класс Facade для данных этого класса /app/libraries/Project/DataFacade.php
use Illuminate\Support\Facades\Facade;
class PJD extends Facade {
protected static function getFacadeAccessor() {
return 'PJData';
}
}
И у меня есть поставщик услуг для них: /app/libraries/Project/DataServiceProvider.php
use Illuminate\Support\ServiceProvider;
class DataServiceProvider extends ServiceProvider {
public function register() {
$this->app->singleton('PJData', function() {
return new PJ\Data;
});
}
}
Я также добавил к /app/config/app.php:
'providers' => array(
// ....
'DataServiceProvider',
),
И в composer.json Я добавил строку psr-4 для направления пространства имен PJ в / app / library / Project
"psr-4": {
"PJ\\": "app/libraries/Project"},
Делая все это, я могу получить доступ к своему классу из любой точки проекта, просто используя PJD :: вместо PJ \ Data ::.
тем не мение, Я также заметил, что просто добавив к /app/config/app.php
'aliases' => array(
//....,
'PJD' => 'PJ\Data',
),
Я получаю точно такой же результат без всех этих фасадов и ServiceProviders. Итак, какой смысл того или другого?
Спасибо, и извините за большой пост.
Фасад а также кличка это две совершенно разные концепции.
вы не могу доступ PJ\Data\
от PJD::
если у вас нет настройки alias
в сервис-провайдере пока привязка.
Если вы обращаетесь к нему, не определяя его в конфиг / app.php, затем вы установили его в самом файле поставщика услуг.
Определение псевдонима,
используется, чтобы указать, что названное лицо также известно или более знакомо под другим указанным именем.
Это просто означает, что вы даете другое имя классу, чтобы вам было легче звонить.
например
если у вас есть такой класс: Foo\Bar\AVeryLongNamespaceClassName\Data
Вы можете просто дать псевдоним (например, ПСР) и получить доступ к его методам и свойствам с помощью этого псевдонима.
Замечания:
Модульное тестирование является важным аспектом того, почему фасады работают так, как они. Фактически, тестируемость является основной причиной существования фасадов.
Других решений пока нет …