• Время чтения ~3 мин
  • 29.03.2024

Есть разница между тем, что 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.

Comments

No comments yet
Yurij Finiv

Yurij Finiv

Full stack

Про мене

Professional Fullstack Developer with extensive experience in website and desktop application development. Proficient in a wide range of tools and technologies, including Bootstrap, Tailwind, HTML5, CSS3, PUG, JavaScript, Alpine.js, jQuery, PHP, MODX, and Node.js. Skilled in website development using Symfony, MODX, and Laravel. Experience: Contributed to the development and translation of MODX3 i...

Об авторе CrazyBoy49z
WORK EXPERIENCE
Контакты
Ukraine, Lutsk
+380979856297