Есть разница между тем, что Laravel называет фасадами, и псевдонимами классов. Давайте посмотрим на оба, на то, чем они отличаются друг от друга, и как они так переплелись друг с другом в глазах общественности.
Фасады
Фасад в Laravel — это не что иное, как прокси объекта в контейнере сервиса. Другими словами, если объект привязан к контейнеру службы как 'my-service'
, вы можете вызывать методы этого объекта, используя статические методы на следующем фасаде:
namespace App\Фасады;
use Illuminate\Support\Фасады\Facade;
class MyServiceFacade extends Facade
{
public function getFacadeAccessor()
{
return 'my-service';
}
}
Notice the 'my-service'
string by which the service is bound to the container. When any static method is called on this facade, the facade's __callStatic()
magic method is invoked, the 'my-service'
service is retrieved from the container, and your call is forwarded to that instance.
You still have to reference the full namespace to this facade (App\Фасады\MyServiceFacade
) when you use it in your application. At least, if you don't also add a class alias.
Псевдонимы
классов PHP позволяет разработчикам присваивать любому классу псевдоним с любым другим именем, используя эту class_alias
функцию. Например, скажем, у меня есть класс с именем Aang
, я мог бы присвоить емуBonzuPippinpaddleopsicopolisTheThird
псевдоним и использовать его как обычно:
class Aang
{
public static function greet(): string
{
return 'Flameo!';
}
}
class_alias(Aang::class, 'BonzuPippinpaddleopsicopolisTheThird');
echo BonzuPippinpaddleopsicopolisTheThird::greet(); // Flameo!
Вы также можете присвоить псевдоним чему-то в другом пространстве имен, если хотите:
namespace App {
class User
{
public static function greet(): string
{
return 'Hello!';
}
}
}
namespace {
class_alias(App\User::class, 'User');
echo \User::greet(); // Hello!
}
Это может быть полезно для использования классов с длинным FQCN в представлениях, где импорт классов с use
операторами может быть невозможен или просто некрасив.
Наиболее очевидным недостатком является то, что вы теряете автозаполнение в большинстве IDE, потому что ваша IDE не может знать, когда и была class_alias()
ли функция вызвана в этот момент в вашем приложении.
Confusion
Laravel aliases all facades it ships with to their base classname like in the second example above. That means all classes in the Illuminate\Support\Фасады
namespace are available as if they were in the global namespace. You can see this happen in your own config/app.php
(the aliases
key).
Я думаю, что именно из-за такого поведения по умолчанию многие люди в сообществе Laravel объединили фасады и псевдонимы классов.
Использование класса в пространстве имен, как если бы он находился в глобальном пространстве имен, относится не только к фасадам. Вы можете присвоить псевдонимы любым классам в вышеупомянутом config/app.php
. Например, вы можете использовать Illuminate\Support\Str
псевдонимы to just Str
и Illuminate\Support\Number
to Num
для быстрого и удобного использования в представлениях.
Заключение Я
\Config
is not a facade, it's a class alias for the facade. There is no reason why you shouldn't import the full namespace to a facade in PHP-only files.
I generally think that you should import the full namespace (use Illuminate\Support\Фасады\Config
) for facades, and not the alias. I also try to limit the use of class aliases in views and opt for the global functions Laravel provides instead because aliases don't work with autocomplete in my IDE without external tooling.