jak migrować kod legacy do symfony? tips & tricks

55
www.xsolve.pl

Upload: xsolve

Post on 15-Mar-2018

46 views

Category:

Software


0 download

TRANSCRIPT

www.xsolve.pl

Jak migrować kod legacy do Symfony?Tips and tricks

www.xsolve.pl

Sławomir RostekSenior PHP Software Developer

Ion BazanPHP Software Developer

@IonBazan

1. Wstęp

2. Kod legacy

3. Przygotowanie

4. Pierwsze podejście

5. Napotkane problemy

6. Drugie podejście

7. Wady i zalety

8. Co dalej?

Plan prezentacji

Wstęp

Kod legacyProblemy

■ PHP 5.5

■ Yii 1.1

■ Kilka testów (żaden nie działa)

■ Zależności wkomitowane w repozytorium

■ Zmiany w frameworku

■ Niespójna baza ze 170 tabelami, bez kluczy

obcych

Od czego zacząć?

KROK 1:

Wdrożenie Dockera dla developmentu

Spójne środowisko i konfiguracja.Ułatwia wdrażanie do projektu i konfigurację środowiska dla nowych developerów.Przejście na PHP 5.6.

KROK 2:

Composer

Nowe zależności i część starych pod kontrolą composera.

KROK 3:

Naprawienie testów i wdrożenie CI

● Tydzień konfigurowania, przepisywania, poprawiania i dopisywania nowych testów.

● Testy uruchamiane w izolacji (Docker) na środowisku CI.

● Wdrożenie mechanizmów statycznej analizy kodu.

KROK 4:

Poprawienie bazy danych

Zapewnienie spójności przy pomocy kluczy

obcych.

KROK 6:

Przekonać klienta do przepisania aplikacji

Przepisywanie aplikacji?A komu to potrzebne?

Jak przekonać do przepisania?

■ Miej przy sobie eksperta

■ Znajdź luki w kodzie

■ Mniej bugów podczas releasów

■ Dostarcz metryki kodu

■ Napisz test pokazujący niepożądane zachowanie aplikacji

■ Powołaj się na autorytet

■ Zbuntuj się?!

Na czym zależało klientowi?

Skalowanie aplikacji i sesja w Memcache

KROK 7:

Do dzieła!

Najpierw powstał planSymfony App

Yii

InternetRequest

Route found in Symfony?

Process Request as usual

yes

Process by LegacyCode\LegacyCodeBundle\Controller\FallbackController

need something from Yii?

no

no

yes

this will be done by “subrequest” with flag $forcePathOverride = true

Create Symfony\Component\HttpFoundation\Response and return it

Spa

Struktura katalogów

● Nowa aplikacja obok starej.● Konfigurowalna ścieżka do

starej aplikacji.● Symlinki do statycznych plików.● Stara aplikacja może działać

samodzielnie gdyby coś poszło nie tak.

Tagi ESI

● Umożliwiają wstrzykiwanie widoków, za które odpowiedzialna jest nowa część aplikacji.

$esi->render('AppBundle:AssignLog:logs',['modelId' => $model->id]

);

Refaktoryzacja,refaktoryzacja i refaktoryzacja

Usuwamy niepotrzebne funkcjonalności

Wszystko to bez ingerencji w kod Yii

Działa?

Now let’s get fancy!

Konfiguracja starej aplikacji w Symfony

● Utworzenie node w konfiguracji odpowiedzialnego za starą aplikację.

● Możliwość dziedziczenia dzięki komponentowi Symfony/Configuration

Wstrzykiwanie nowych serwisów do starej aplikacji

● Serwisy z Symfony trzymane w specjalnym kontenerze.

● Wstrzykiwanie kontenera odbywa się w kontrolerze.

Mamy problem

■ Niektóre akcje kończą się exitem

Rozwiązanie?

■ Developer usunął wszystkie exit i zastąpił je returnem

■ Rzucanie ApplicationTerminatedException

register_shutdown_function()

ShutdownableKernel

● Obsługuje wywołanie exit() wewnątrz kodu.

● Deleguje utworzenie Response ze zbuforowanego wyjścia i przesyła go do klienta.

ShutdownListener

● Rejestruje metodę shutdown jako shutdown_function przed wywołaniem kodu kontrolera.

● Odwołuje rejestrację w wypadku braku wywołania exit w kontrolerze (poprawnie wygenerowany Response).

HeaderListener

● Kopiuje ustawione nagłówki do Response

● Ustawia odpowiedni kod odpowiedzi

OutputBufferListener

● Włącza buforowanie wyjścia przed uruchomieniem kodu kontrolera.

● Ustawia zbuforowane wyjście jako treść odpowiedzi.

Klient wymyśla nową funkcjonalność.Potrzebujemy wynik z aplikacji legacy?

ResponseCallbackListener

● Wywołuje callback tuż przed zwróceniem odpowiedzi i umożliwia jej podmianę

Konfiguracja

● RequestMatcher decyduje o tym, czy przetworzyć aktualny Request

OutputBufferListener:Enable buffering

Request

FallbackController:Process request by legacy app

OutputBufferListener:Generate Response from buffer

HeaderListener:Add headers to Response

exit() called?

LegacyHttpKernel:Ask for response and send it to client

ResponseCallbackListener:Use a closure to modify the

Response

Response

YesNo

A logi?

Logi w Monolog

● Prosty MonologRoute konwertujący wpisy do logów Yii na wpisy Monologa.

● Dodanie Route do komponentu log podczas budowania starej aplikacji

Działa?

Now let’s get fancy!

DataCollectors

● Znacznie ułatwiają profilowanie● Pomagają odnaleźć się w

gąszczu szablonów● Wyświetlają logi i zapytania

starej aplikacji

Podsumowanie

■ Znormalizuj kod

■ Pisz testy!

■ Staraj się przepisywać funkcjonalności małymi krokami

■ Twórz metryki w oparciu o statyczną analizę kodu

■ Ułatwiaj sobie życie przy pomocy narzędzi, jakie oferuje

framework

Dzięki!

Źródła?

bangpound/LegacyPhpHttpKernel

https://symfony.com/doc/current/components/http_kernel.html

www.xsolve.pl

[email protected]