Dependency Injection na prostym przykładzie w PHP

Cześć! Dzisiaj na tapecie wzór projektowy wstrzykiwanie zależności. Co znajdziesz w tym wpisie:

Czym jest wstrzykiwanie zależności?

Jest to przekazywanie potrzebnej zależności poprzez argument zamiast tworzenia jej. Zanim poznałem DI, miałem zwyczaj pisać kod który w locie tworzył sobie potrzebne zależności. Przykład z życia wzięty:

Jak byś przetestował tą klasę? Ja widzę tylko jedną opcję:

  1. Tworzysz nową instancję,
  2. Za jej pomocą wgrywasz plik na S3,
  3. Weryfikujesz czy plik został wgrany na S3.

Skomplikowane prawda? Wynika to z faktu że klasa jest silnie (wręcz nierozerwalnie) powiązana z klasą klienta S3. Nie możemy przekazać imitacji klienta. To powoduje następujące konsekwencje:

  • nie da się napisać testu jednostkowego – test jest integracyjny,
  • testowanie wymaga połączenia sieciowego oraz poprawnej konfiguracji S3,
  • takie test będzie trwał dużo dłużej niż prosty test jednostkowy.

Jak rozwiązać ten problem? Użyj wstrzykiwania zależności!

Jak je zaimplementować?

Tej klasie do działania potrzebna jest instancja klienta S3. Przekażę ją przez argument konstruktora:

Alternatywną opcją jest użycie settera. Dzięki temu podejściu możemy w łatwy sposób przekazać właściwą instancję klienta S3. Prawdziwą w środowisku produkcyjny a w środowisku testowym imitację.

Implementacja testu w PHPSpec:

Cały test jest bardzo prosty do napisania, trwa 93ms 🙂

Jakie ma plusy i minusy?

Zacznę od plusów:

  • ułatwia a czasem wręcz umożliwia pisanie testów jednostkowych,
  • rozluźnia powiązanie między klasami, w przypadku użycia interfejsów czy klas abstrakcyjnych powiązanie jest jeszcze słabsze,
  • wyprowadzania logikę tworzącą obiekty w inne miejsca

Minusy:

  • gdzieś te obiekty trzeba stworzyć, w prostych projektach tworzę klasy fabryki, w większych zdecydowanie polecam użycie kontenera wstrzykiwania zależności,
  • kod może się wydawać trudniejszy do zrozumienia.

Linki

Wyszukiwanie duplikatów w bazie danych MySQL

Czołem!

Miałem dzisiaj krótką batalię z jedną tabelką w bazie. Tak wygląda jej struktura:

Posiada ona klucz unikalny na dwa pola, page_id oraz name. Akurat pisaliśmy migrację która robiła TRIM() na polu name. Jednak migracja się wykładała ponieważ były wpisy duplikaty z białymi znakami. Problem który musiałem rozwiązać to sposób w jaki wyszukać te duplikaty i je poprawić.

Czytaj dalej Wyszukiwanie duplikatów w bazie danych MySQL

Jak sprawdzić które pliki się zmieniły względem innego branch?

Szybki post!

Jeśli chcesz sprawdzić które pliki zostały zmienione w branchu względem innego to wystarczy na danym branch wywołać komendę:

Wyświetli nam listę zmienionych plików względem master 🙂

Przydatne gdy chcemy np. zmienione pliki odpalić w ESLint czy innym narzędziu.

Repozytorium ustawień w PhpStorm / WebStorm

Cześć

Miał być post w niedzielę, jest w poniedziałek! 🙂

Dzisiaj krótko. Mało kto wie o wspaniałej wtyczce do naszego IDE – Settings Repository. Pozwala nam na zapisywanie ustawień aktualnego projektu do zewnętrznego repozytorium (polecam Bitbucket). Dzięki temu mamy te same ustawienia w domu, w pracy, czy w każdym innym miejscu. Ustawienia się synchronizują w pełni automatycznie. Więc w nowym miejscu możesz się poczuć jak w domu.

Konfiguracja

Czytaj dalej Repozytorium ustawień w PhpStorm / WebStorm

Kahlan – PHP test framework – dla wolności, prawdy i sprawiedliwości

TDD

Czyli coś co chyba każdy z nas robi – a przynajmniej powinien! Kto słyszał o PHPUnit? Albo o PHPSpec? A może Codeception? To dobre i sprawdzone narzędzia które mają jednak swoje minusy. Dzisiaj chcę wam zaprezentować całkiem świeże narzędzie – Kahlan.

Co to kurcze jest?

Jest to kolejny framework do pisania testów. Czym się różni od poprzednich? Na pewno składnią. Czy znacie RSpec albo jasmine? Tutaj mamy bardzo podobną implementację dla PHP, a więc używamy describe-it. Jest to cholernie wygodne i łatwe do zrozumienia. Chcecie przykład*?

Czytaj dalej Kahlan – PHP test framework – dla wolności, prawdy i sprawiedliwości

Złe strony JavaScriptu – new oraz this

Cześć!

Słowem wstępu…

Obiecałem wam ostatnio, że dodam wpis w ciągu dwóch tygodni. Jednak pisząc ostatniego posta zapomniałem, że za chwilę mam ślub i podróż poślubną…

Ah ten czas szybko leci! Wydarzenia te wydłużyły proces produkcji tego artykułu. Za co z góry przepraszam!

Co dzisiaj?

Rozważymy dwa problematyczne elementy JavaScriptu. Operator new oraz słowo kluczowe this.

Brak operatora new

Konstruktor to zwykła funkcja. Co się stanie gdy pominiesz operator new?

Czytaj dalej Złe strony JavaScriptu – new oraz this

ESLint – install and config – PhpStorm/WebStorm and git pre commit hook

Hello there! It’s been awhile since last post. Sorry 🙁

Let’s talk about JavaScript linting. If you don’t know what is it – go to wikipedia.

Quick Introduction

Currently we have four linting tools available:

Czytaj dalej ESLint – install and config – PhpStorm/WebStorm and git pre commit hook

Running and debugging Karma in PhpStorm / WebStorm

Hello!

Recently I wrote a post about configuring the Karma with RequireJS and PhantomJS (http://damian.dziaduch.pl/2015/09/12/karma-among-with-jasmine-requirejs-and-phantomjs/).

Today I’d like to move on and use the Karma inside the IDE instead of terminal. Before we start make sure you have installed & enabled Karma plugin and JavaScript debugger plugin in PhpStorm. I’m going to work on my previous example.

Czytaj dalej Running and debugging Karma in PhpStorm / WebStorm

PhpStorm Refactoring tutorial, part 3 – moving the class

Welcome in third part of my tutorial!

Today we are going to learn common thing while code refactor – class movement.

What I always did was to manually move the file in the Finder and then changed it’s namespace in the IDE. Finally I had to search whole project for class name etc. But PhpStorm can do all of that with one simple action.

I’m going to move the class \app\models\User to \common\models\User (Yii2 project).

Let me show you the beginning of my class:

First thing what you need to do is to move the cursor into class name and open refactor menu (right click -> refactor, or press ctrl + t) and choose Move.

Fill the target namespace. I always check two checkboxes, Search in comments and string and Search for text occurrences. This will allows us to refactor the PHPDoccomments and other places where the class name exists.

Before pressing the Refactor button, I recommend to Preview the changes. All found places you will see on the list like this:

class move refactor

With second mouse button you can exclude results from refactoring. When you’re done, press Do Refactor. Now run your tests. Everything should work like as a charm!

Thank you for reading. Have a good day!