Dependency inversion w php

44
Dependency Inversion w PHP

Transcript of Dependency inversion w php

Dependency Inversion w PHP

O MNIE

Rafał Kański

Software Engineer w Schibsted Tech Polska

http://blogophp.com

ZACZYNAMY...

TYPOWY DZIEŃ PRACY...

Pobieranie artykułów ze strony artykuly.pl

ZADANIE:

TYPOWY DZIEŃ PRACY...

DOBRA WIADOMOŚĆ:

Strona oferuje klienta do pobierania artykułów

TYPOWY DZIEŃ PRACY...

LEPSZA WIADOMOŚĆ:

Klienta można zainstalować composerem

INSTALUJEMY...

COMPOSER.JSON{ "name": "application/my-app", "description": “Project", "minimum-stability": "stable", "require": { "artykuly/api-client": "^1.2" }}

TYPOWY DZIEŃ PRACY...

Zapisywanie danych z rssowego feeda feed.pl

KOLEJNE ZADANIE:

TYPOWY DZIEŃ PRACY...

DOBRA WIADOMOŚĆ:

Do pobierania feeda można użyć prostego klienta

TYPOWY DZIEŃ PRACY...

LEPSZA WIADOMOŚĆ:

Klienta do feeda można zainstalować composerem

INSTALUJEMY...

COMPOSER.JSON{ "name": "application/my-app", "description": “Project", "minimum-stability": "stable", "require": { "artykuly/api-client": "^1.2", "feed/api-client": "^2.1" }}

POTENCJALNE ZAGROŻENIE

TYPOWY DZIEŃ PRACY...

APLIKACJA

JEDNA APLIKACJA WIELE KLIENTÓW API

KLIENT API

KLIENT API

KLIENT API

KLIENT APIJSON

XMLOAUTH

SAML

KLIENT API

KLIENT API POD MASKĄ

KLIENT HTTP

WŁASNY GOTOWYCZY

KLIENT API

TO JESZCZE NIE JEST PROBLEM...

KLIENT HTTP

GOTOWY

JEDEN KLIENT API

PROBLEM POJAWIA SIĘ GDY...

GUZZLE

^5.3

DRUGI KLIENT API

GUZZLE

^6.2

JAKO TWÓRCA KLIENTA API

“Uzależniaj kod od abstrakcji a nie od klas rzeczywistych”

Dependency Inversion

JAKO TWÓRCA KLIENTA API

{ "name": "somename/api-client", "description": "API Client", "minimum-stability": "stable", "require": { "guzzlehttp/guzzle": "^6.2" }}

Uzależniam się od klas rzeczywistych...MINUS

Dependency Inversion

w composerze?

JAKO TWÓRCA KLIENTA API

ROZWIĄZANIE

WIRTUALNA PACZKA

{ "name": "somename/virtual-package-implementation", "description": "I deliver implementation", "provide": { "somename/virtual-package-name": "1.0" }, "require": { "somename/virtual-package-interfaces": "^1.2" }}

JAK SZUKAĆ WIRTUALNYCH PACZEK?

PACKAGIST

MOŻEMY JEJ WYMAGAĆ W COMPOSER

JAKO TWÓRCA KLIENTA API

Jak uniezależnić się od implementacji?PYTANIE

{ "name": "somename/api-client", "description": "API Client", "minimum-stability": "stable", "require": { "guzzlehttp/guzzle": "^6.2" }}

JAKO TWÓRCA KLIENTA API

Zbiór interfejsów dla klienta HTTP?PYTANIE

PSR-7 psr/http-message

A paczka wirtualna dla tych interfejsów?

JAKO TWÓRCA KLIENTA API

PYTANIE

PSR-7 psr/http-message-implementation

JAKO TWÓRCA KLIENTA API

PACKAGIST psr/http-message-implementation

PSR-7 nie daje interfejsu klienta HTTP

JAKO TWÓRCA KLIENTA API

PROBLEM

RequestInterface ResponseInterface

UriInterface...PSR-7

http://httplug.io

JAKO TWÓRCA KLIENTA API

ROZWIĄZANIE

JAKO TWÓRCA KLIENTA API

Zbiór interfejsów dla klienta HTTP

HTTP-PLUG php-http/httpplug

JAKO TWÓRCA KLIENTA API

Wirtualna paczka dla klienta HTTP

HTTP-PLUG php-http/client-implementation

JAKO TWÓRCA KLIENTA API

PACKAGIST php-http/client-implementation

JAKO TWÓRCA KLIENTA API

KTO UŻYWA?

JAKO TWÓRCA KLIENTA API

JAK WYGLĄDA?

UZALEŻNIAMY SIĘ OD WIRTUALNEJ PACZKI

INSTALACJA

{ "name": "somename/api-client", "description": "API Client", "minimum-stability": "stable", "require": { "php-http/client-implementation": "^1.0" }}

UZALEŻNIAMY SIĘ OD WIRTUALNEJ PACZKI

{ "name": "somename/api-client", "description": "API Client", "minimum-stability": "stable", "require": { "php-http/client-implementation": "^1.0" }}

JAK ZACHOWA SIĘ COMPOSER PRZY composer install

WADY WIRTUALNYCH PACZEK

COMPOSER POINFORMUJE ŻE NIE ODNALAZŁ PACZKI 1

ROZWIĄZANIE

WADY WIRTUALNYCH PACZEK

COMPOSER POINFORMUJE ŻE NIE ODNALAZŁ PACZKI 1

ROZWIĄZANIE

WIEDZA CZYM JEST WIRTUALNA PACZKA WIEDZA JAK JE INSTALOWAĆ

WADY WIRTUALNYCH PACZEK

WIRTUALNĄ PACZKĘ MOŻNA STWORZYĆ NIE IMPLEMENTUJĄC INTERFEJSÓW 2

{ "name": "somename/virtual-package-implementation", "description": "I don’t deliver implementation", "provide": { "somename/virtual-package-name": "1.0" }}

WADY WIRTUALNYCH PACZEK

MOŻE ISTNIEĆ BIBLIOTEKA DOSTARCZAJĄCA INTERFEJS NIE INFORMUJĄC O TYM 3

{ "name": "somename/virtual-package-implementation", "description": "I deliver implementation", "require": { "somename/virtual-package-interfaces": "^1.2" }}

WADY WIRTUALNYCH PACZEK

KAŻDY MOŻE STWORZYĆ PACZKĘ WIRTUALNĄ O DOWOLNEJ NAZWIE 4

{ "name": "somename/virtual-package-implementation", "description": "I don’t deliver implementation", "provide": { "somename/virtual-package-name-typo": "1.0" }}

ZALETY WIRTUALNYCH PACZEK

ROZWIĄZUJEMY PROBLEM KONFLIKTÓW W COMPOSERZE PRZY INSTALACJI 1

DAJEMY WYBÓR UŻYTKOWNIKOM KONKRETNEJ BIBLIOTEKI 2

ZALETY WIRTUALNYCH PACZEK

MAM GUZZLE 5 TO INSTALUJE ADAPTER

NIE PODOBA MI SIĘ WYDAJNOŚĆ TO ZMIENIAM IMPLEMENTACJĘ

UZALEŻNIAMY KOD OD ABSTRAKCJI/INTERFEJSÓW KORZYSTAJĄC Z COMPOSERA 3

ZALETY WIRTUALNYCH PACZEK

PRZYKŁAD KLIENTA

https://github.com/Schibsted-Tech-Polska/capi_php_sdk

{ “require”: { "php": ">=5.5", "php-http/client-implementation": "^1.0", "php-http/message-factory-implementation": "^1.0" } ….}

PYTANIA