Laravel i podpowiedzi IDE? To możliwe

Nie ukrywajmy - magii w Laravelu jest dużo. Na tyle dużo, że można ją kochać bądź nienawidzić - nie wyobrażam sobie stanu pośredniego. Abstrahując zupełnie od tego, czy takie rozwiązanie jest słuszne, trzeba mu wytknąć jedną, definitywną wadę. Zintegrowane środowiska programistyczne (IDE) w kontakcie z nią po prostu wariują.

Nie ma problemu dopóki korzystamy z prostych edytorów tekstowych typu Sublime Text, Atom czy Visual Studio Code. Więszkość z nich albo w ogóle nie dostarcza podpowiedzi dla kodu PHP lub są one mało "inteligentne". Bazują na prostym słowniku użytych symboli (nazw funkcji, klas czy zmiennych) i wyszukiwarce. Tutaj rysuje się jedna z głównych różnić pomiędzy edytorem, a IDE - środowisko programistyczne stara się "zrozumieć kod". Za pomocą różnych zaawansowanych parserów stara się przewidzieć zachowanie faktycznego interpretera PHP i jako podpowiedzi podaje nam tylko to, czego możemy faktycznie użyć w danym kontekście, bez spowodowania błędu. Nie dostaniemy w podpowiedzi zmiennej, która jest niedostępna w danym zasięgu, ponieważ PHP jako interpreter też nie byłby jej w stanie użyć.

Mimo całej swojej "inteligencji" IDE nie odwzorowują jednak w stu procentach zachowania języka - złożoność takiego programu byłaby naprawdę ogromna, a prędkość działania niezadowalająca. Dlatego występują sytuacje, w których dany kod w rzeczywistości działa, a IDE po prostu się "gubi". Nie przetwarza wszystkich dynamicznych sytuacji obecnych na przykład przy użyciu wspomnianej magii języka.

Z opisaną sytuacją spotkał się na pewno każdy, kto próbował używać projektu napisanego w Laravelu w którymkolwiek z popularnych środowisk programistycznych dla PHP, na przykład PhpStormie. Zaznaczę że mówimy tu głównie o wykorzystaniu fasad (w rozumieniu Laravela), których można unikać - promuje je jednak sama dokumentacja. W praktyce program pokazuje tak wiele błędów, że żeby nie rozpraszać się nimi trzeba by wyłączyć praktycznie wszystkie podpowiedzi (lub tzw. inspekcje). Przyznacie jednak, że pozbawienie IDE całej jego "inteligencji" i tym samym zrobienie z niego zwyczajnego edytora trochę mija się z celem.

Czy jest na to jakieś rozwiązanie? Oczywiście.

W przypadku Laravela możemy użyć bardzo popularnej paczki laravel-ide-helper. Analizuje ona kod frameworka i generuje plik będący swego rodzaju "mapą" pomiędzy fasadami, prostymi interfejsami używanymi przez programistę, a normalnymi klasami, których wewnętrznie używa framework, komunikując te dwie warstwy za pomocą sporej ilości skomplikowanych odwołań i opisywanej magii.

Tak wygenerowany plik, obecny w katalogu projektu wystarcza aby więszkość środowisk potrafiła nadążyć za sztuczkami zastosowanymi w Laravelu. Nie tylko przestała pokazywać błędy, ale faktycznie zaczęła pomagać, na przykład podpowiadając dostępne metody i ich parametry.

Zaczynamy od zainstalowania paczki przy użyciu Composera. Myślę że dowolnej osobie używającej Laravela czy innego nowoczesnego frameworka PHP nie trzeba tłumaczyć obsługi tego narzędzia.

composer require --dev barryvdh/laravel-ide-helper

Zwróćcie uwagę że instalujemy paczkę jako zależność deweloperską. Skutkuje to tym, że w środowisku produkcyjnym w ogóle nie będzie ona pobierana. Teraz przechodzimy do kolejnego kroku, czyli zarejestrowania Service Providera, który komunikuje paczkę z frameworkiem. Tutaj też odbiegniemy nieco od standardowej metody, czyli dodania wpisu w config/app.php i rejestracji Service Providera dokonamy warunkowo. Dlaczego? Ponieważ w przeciwnym razie, w środowisku produkcyjnym (a więc pominięciu instalacji tej paczki) framework próbowałby użyć nieistniejącej klasy. Dlatego też otworzymy plik app/providers/AppServiceProvider.php i w metodzie register() dodamy następujący kod:

public function register()
{
    if ($this->app->environment() !== 'production') {
        $this->app->register(Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider::class);
    }
    // ...
}

Dzięki temu framework nie będzie próbował rejestrować Service Providera na produkcji.

Następnie możemy już skorzystać z udostępnionych nam komend.

php artisan clear-compiled
php artisan ide-helper:generate
php artisan optimize

Paczka udostępnia nieco więcej opcji, włącznie z generowaniem dokumentacji dla naszych modeli, jednak nie są one generowane domyślnie. Po szczegóły raz jeszcze odsyłam do oficjalnego repozytorium

W głównym katalogu projektu powstanie plik _ide_helper.php. Nie musimy go nigdzie dołączać, w tym momencie wszystko powinno już działać. Ów plik zdecydowanie dodajmy do ignorowanych przez Gita, o ile z niego korzystamy (a przecież wszyscy to robimy, prawda?). W najprostszym wariancie dodajemy linię /_ide_helper.php do .gitignore. O tym, dlaczego niekoniecznie jest to najlepszy pomysł, postaram się napisać już niedługo ;)


Powyższy wpis przedstawia część doświadczeń zdobytych przy tworzeniu projektu Codice. Po więcej szczegółów zapraszam do pierwszego wpisu oraz na codice.eu. Poza planowaną od dawna serią jest to też realizacja wymogów konkursu "Daj Się Poznać". Więcej o nim możecie przeczytać w tym wpisie. Po nowe materiały poświęcone tworzeniu projektu Codice zapraszam w każdy wtorek. Ponadto więcej wpisów, poświęconych temu projektowi lub ogólnej tematyce bloga przeczytacie co sobotę.

Komentarze wyłączone

Możliwość komentowania na blogu została wyłączona. Zapraszam do kontaktu na Twitterze, Facebooku lub poprzez formularz, o ten tutaj. Do usłyszenia!