• Час читання ~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 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