Є різниця між тим, що 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
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.