• Czas czytania ~3 min
  • 29.03.2024

Istnieje różnica między tym, co Laravel nazywa fasadami, a aliasami klas. Przyjrzyjmy się obu, jak bardzo się od siebie różnią i jak tak bardzo splotły się ze sobą w oczach opinii publicznej.

Fasady

Fasada w Laravelu to nic innego jak proxy do obiektu w kontenerze usługowym. Innymi słowy, jeśli obiekt jest powiązany z kontenerem usługi jako 'my-service', można wywoływać metody na tym obiekcie przy użyciu metod statycznych na następującej fasadzie:

namespace App\Fasady;
use Illuminate\Support\Fasady\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\Fasady\MyServiceFacade) when you use it in your application. At least, if you don't also add a class alias.

Aliasy

klas PHP pozwalają programistom na aliasowanie dowolnej klasy do dowolnej innej nazwy za pomocą class_alias funkcji. Na przykład, powiedzmy, że mam klasę o nazwie Aang, mógłbym ją alias doBonzuPippinpaddleopsicopolisTheThird i używać jej jak normalnie:

class Aang
{
	public static function greet(): string
	{
		return 'Flameo!';
	}
}
class_alias(Aang::class, 'BonzuPippinpaddleopsicopolisTheThird');
echo BonzuPippinpaddleopsicopolisTheThird::greet(); // Flameo!

Możesz także aliasować coś do innej przestrzeni nazw, jeśli chcesz:

namespace App {
    class User
    {
        public static function greet(): string
        {
            return 'Hello!';
        }
    }
}
namespace {
    class_alias(App\User::class, 'User');
    echo \User::greet(); // Hello!
}

Może to być przydatne do używania klas z długim FQCN w widokach, gdzie importowanie klas z use instrukcjami może nie być możliwe lub jest po prostu brzydkie.

Najbardziej oczywistą wadą jest to, że w większości środowisk IDE utracisz autouzupełnianie, ponieważ środowisko IDE nie może wiedzieć, kiedy/czy funkcja została wywołana class_alias() w tym momencie w aplikacji.

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\Fasady 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).

Myślę, że to domyślne zachowanie jest powodem, dla którego wiele osób w społeczności Laravela pomieszało fasady i aliasy klasowe.

Używanie klasy w przestrzeni nazw tak, jakby znajdowała się ona w globalnej przestrzeni nazw, nie jest przeznaczone tylko do fasad. Możesz aliasować dowolne klasy we wspomnianym config/app.phpwcześniej pliku . Na przykład można użyć aliasu Illuminate\Support\Str just Str i Illuminate\Support\Number toNum, aby szybko i łatwo używać go w widokach.

Wnioski

\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\Fasady\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

O

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...

O autorze CrazyBoy49z
WORK EXPERIENCE
Kontakt
Ukraine, Lutsk
+380979856297