Wprowadzenie do doktryny ORM i wzoru mapowania danych w PHP

Wprowadzenie do doktryny ORM i wzoru mapowania danych w PHP

Cel

Poznaj podstawowe pojęcia doktryny ORM, wdrażając wzór mapowania danych z PHP.

Wymagania

  • Kompozytor (menedżer pakietów PHP)
  • Konfiguracja lampy roboczej
  • Zrozumienie podstawowego programowania zorientowanego na obiekt i PHP
  • Zrozumienie podstawowych pojęć bazy danych

Konwencje

  • # - Wymaga podanych poleceń Linuksa, które można wykonać z uprawnieniami root
    bezpośrednio jako użytkownik root lub za pomocą sudo Komenda
  • $ - Wymaga, aby podane polecenia Linux zostały wykonane jako zwykły użytkownik niepewny

Wstęp

Wzór mapowania danych jest wzorem architektonicznym, za pomocą którego możliwe jest osiągnięcie oddzielenia między warstwą trwałości danych (w tym przypadku bazy danych MySQL) i reprezentacją danych w pamięci (w tym przypadku obiektów PHP), aby obie warstwy mogły być oddzielone i można je oddzielić i całkowicie nieświadomi siebie, szanując w ten sposób rozdzielenie obaw.

W tym samouczku zobaczymy, jak podjąć nasze pierwsze kroki z doktryną, implementacja wzorca mapowania danych, która jest częścią Symfony Framework PHP, ale można go również używać samodzielnie.

Tworzenie bazy danych

Przed cokolwiek innego powinniśmy utworzyć bazę danych, której użyjemy do trwałości danych. W tym samouczku będziemy reprezentować użytkownika i jego posty na blogu:

Mariadb [(brak)]> Utwórz blog bazy danych; Mariadb [(none)]> Uznacz wszystkie przywileje na blogu.* Do „testuser”@„localHost” zidentyfikowane przez „testPassword”; Mariadb [(none)]> Przywileje spłukające; Mariadb [(none)]> exit; 


Zainstaluj i zainicjuj doktrynę

Następnym krokiem w naszej podróży będzie instalacja doktryny: będziemy używać kompozytor, pakiet PHP i menedżer zależności. W korzeni naszego projektu tworzymy kompozytor.plik JSON, określając doktryna/ORM jako zależność:

„wymaga”: „doktryna/orm”: „^2.6 " 
Kopiuj

Teraz, aby kontynuować instalację, podczas gdy w tym samym katalogu otwórz terminal i uruchom:

$ instalacja kompozytora

Kompozytor zainstaluje doktrynę i wszystkie jego zależności wewnątrz sprzedawca katalog, który stworzy. Po zainstalowaniu doktryny musimy ją zainicjować. Zapisz poniższy kod w pliku (w tym samouczku nazwiemy go Bootstrap.php):

 „Blog”; „User” => „TestUser”, „hasło” => „testPassword”, „host” => „localHost”, „Driver” => 'pdo_mysql']; // Pobierz entity Manager $ entity_manager = doktryna \ orm \ entityManager :: create ($ connection_parameters, $ konfiguracja); 
Kopiuj

Przede wszystkim potrzebowaliśmy w wierszu 2 pliku AutoLoad Composer Autoload.php, który zajmuje się autoladowaniem potrzebnych bibliotek.

Wzywając CreateAnnotationMetAtAtAconfiguration Metoda statyczna Organizować coś Klasa w wierszu 5 zaczęliśmy konfigurować doktrynę. Ta metoda przyjmuje 5 argumentów, ale zapewnimy tylko pierwsze dwa, pozostawiając resztę ich niewykonania zobowiązań, ponieważ w tej chwili nie jesteśmy nimi zainteresowani.



Pierwszym argumentem w wierszu 6 jest szereg ścieżek, w których w naszym projekcie można znaleźć klasy jednostek. Jednostka to klasa, która reprezentuje wiersz w bazie danych (rapresentacja w pamięci, o której wspomnialiśmy powyżej): W naszym przykładzie użyjemy dwóch podmiotów: autora i postu.

Drugi argument w wierszu 7 ma wartość logiczną i określa, czy pracujemy w trybie „dev”, czy nie. To określa zachowanie doktryny dotyczące obiektów proxy i buforowania: w trybie „dev” obiekty proxy zostaną zregenerowane na każdym żądaniu, a buforowanie nastąpi w pamięci, ponieważ zakłada się, że podczas rozwoju zmiany nastąpiły bardzo często. Na razie ustawimy to na prawdziwe.

Następnie musimy określić parametry połączenia w wierszach 11-16, w formie tablicy asocjacyjnej zawierającej, w kolejności nazwy bazy danych, użytkownika bazy danych, hasła do bazy danych, hosta bazy danych i sterownika, aby uzyskać dostęp do bazy danych. Należy zauważyć, że na niższym poziomie używa doktryny PDO do interakcji z bazą danych i jest ona zaprojektowana tak, aby była baza danych-agnostic.

Wreszcie stworzyliśmy instancję obiektu EntityManager w wierszu 20, nazywając metodę fabryczną „Utwórz” klasy EntityManager, przekazując tablicę informacji o połączeniu, którą zdefiniowaliśmy jako pierwszy parametr i Konfiguracja obiekt jako drugi. Obiekt EntityManager da nam dostęp do wszystkich naszych podmiotów i sprawi, że będziemy w stanie łatwo zarządzać ich wytrwałością i cyklem życia.

Tworzenie naszych bytów

Czas stworzyć nasze podmioty. Tak jak stwierdziliśmy w konfiguracji, utworzymy katalog „jednostek” w korzeni naszego projektu, aby przechowywać nasze podmioty. Pierwszym istotą, którą zamierzamy zdefiniować Autor:

Kopiuj

Zdefiniowaliśmy naszą pierwszą, bardzo prostą byt. Użyliśmy Adnotacje Aby zapewnić doktrynę niezbędnych informacji, aby sobie z tym poradzić. Najpierw w linii 5, używając, @Podmiot Mówimy o doktrynie, że klasę należy uznać za byt, który będzie utrzymywany w autor Tabela bazy danych. W takim przypadku użyliśmy adnotacji @Table (name = ”) w wierszu 6, aby to określić, jednak w tej sytuacji jest zbędna i moglibyśmy to całkowicie pominąć: jest opcjonalna, a jeśli nie jest używana, byt entety będzie utrzymywany w tabeli nazwanej na cześć niewykwalifikowany Nazwa klasy.

Każda właściwość klasy odpowiada kolumnie w tabeli i musimy podać informacje o typie danych tabeli. $ id Na przykład właściwość reprezentuje klucz podstawowy tabeli: podajemy to przy użyciu @ID adnotacja w linii 11.

Wartość ID kolumna będzie automatycznie generowana, dlatego użyliśmy @GeneratedValue adnotacja w linii 12. Ma sens tylko wtedy, gdy jest powiązany @ID, Używając go, można nawet określić strategię generowania do przyjęcia (jeśli nie zostanie określone, będzie domyślnie AUTOMATYCZNY).

Data danych użyty dla naszego klucza podstawowego będzie Smallint, które zdefiniowaliśmy przez @Column (type = „SmallIt”) adnotacja w linii 13. Pozostałe dwie nieruchomości to $ First_name i $ last_name i są one zdefiniowane tą samą techniką. Są typu strunowy: Podczas korzystania z MySQL zostanie to przetłumaczone na Varchar Typ danych bazy danych. Aby uzyskać pełne odniesienie o skojarzeniach typów danych, możesz zapoznać się z tą stroną.

Podczas korzystania z doktryny widoczność właściwości klasy jednostki może być albo chroniony Lub prywatny ale nie publiczne.



Nie definiowaliśmy jeszcze zdobywców i setterów dla klasy. Nie trzeba tego robić ręcznie, ponieważ doktryna może to dla nas zrobić, i zobaczymy, jak za chwilę nadal mamy inny byt, aby zdefiniować, Post:

Kopiuj

Wprowadziliśmy dwa nowe typy danych. Pierwszy jest tekst w wierszu 23, który mapuje i przekonwertuje dane ciągów bez maksymalnej długości: podczas korzystania z MySQL zostanie on przekonwertowany na Longtext typ danych. Drugi jest Datetime w linii 28, dla naszego $ data nieruchomość. Zostanie przetłumaczony na ten sam typ dla MySQL, aw przypadku PHP Datetime obiekt.

Teraz możemy wygenerować nasze zdobyte i setery, ale zanim to zrobimy Cli-Config.php Skrypt w korzeni naszego projektu: jest potrzebny, aby użyć doktryny z wiersza poleceń:

Kopiuj

Teraz otwórz powłokę terminalową w katalogu głównym projektu i wykonaj następujące polecenie Linux:

$ php dostawca/bin/doktryna ORM: generuj elementy .

Powyższe polecenie wygeneruje zdobyte i setki dla znalezionych podmiotów i umieści je w określonym katalogu. Teraz, jeśli spojrzymy na Autor Jednostka Widzimy, że wygenerowano Getters i Seters:

ID;  /*** Set FirstName. * * @Param String $ FirstName * * @return Autor */ public Funkcja setFirstName ($ FirstName) $ this-> First_name = $ FirstName; zwrócić to;  /*** Zdobądź nazwę pierwszego. * * @return string */ public Funkcja getFirstName () return $ this-> First_name;  /*** Ustaw LastName. * * @param string $ lastName * * @return autora */ public funkcja setlastName ($ lastName) $ this-> last_name = $ lastName; zwrócić to;  /*** Zdobądź LastName. * * @return string */ public funkcja getLastName () return $ this-> last_name;  
Kopiuj

To samo wydarzyło się dla Post podmiot:

ID;  /*** Ustaw tytuł. * * @param string $ title * * @return post */ public Funkcja Settitle ($ title) $ this-> title = $ title; zwrócić to;  /*** Zdobądź tytuł. * * @return string */ public Funkcja getTitle () return $ this-> tytuł;  /** * Ustaw tekst. * * @param string $ text * * @return post */ public funkcja setText ($ text) $ this-> text = $ text; zwrócić to;  /*** Pobierz tekst. * * @return String */ public funkcja getText () return $ this-> text;  /** * Ustawić datę. * * @param \ dateTime $ data * * @return post */ public funkcja setDate ($ data) $ this-> data = $ data; zwrócić to;  /*** Data zdobądź. * * @return \ dateTime */ public funkcja getDate () return $ this-> data;  
Kopiuj

Definiowanie związku między bytami

W naszym przykładzie chcemy zdefiniować dwukierunkowy dla wielu związek między naszymi podmiotami, gdzie dwukierunkowy oznacza, że ​​każdy podmiot ma odniesienie do drugiego. Relacje między autorem a jego postami są wiele do jednego (autor może pisać wiele postów, a wiele postów może należeć do jednego autora). Korzystanie z doktryny definiowanie takiego skojarzenia jest bardzo proste:

Kopiuj

Dodaliśmy jedną nową nieruchomość w każdym podmiotu. W autorze to jest $ Posty w wierszu 16 i w podmiotu postu, Autor $ w linii 36. Jaki rodzaj danych będzie utrzymywał te zmienne? Pierwszy, $ Posty będzie przykładem doktryny ArrayColletion Obiekt: Jest to specjalna klasa używana do lepszego zarządzania gromadzeniem jednostek.

Druga, Autor $, W Post.php, będzie instancją podmiotu autora, reprezentującego autora postu: Jak powiedziano wcześniej, każdy podmiot odniesie do drugiego.

Podobnie jak to, co zrobiliśmy dla innych właściwości, zdefiniowaliśmy związek, używając adnotacji. W naszym przypadku, ponieważ mamy do czynienia z dwukierunkową relacją jeden do wielu, wykorzystaliśmy @Jeden za dużo adnotacja w linii 13, w jednostce autora i @ManyToone w linii 32 w poście.

W obu przypadkach z Celowość Zdefiniowaliśmy, jaki byt wskazuje nieruchomość. Na przykład w przypadku autora $ Posty właściwość, docelowym podmiotem jest post. Jak widać, użyliśmy odpowiednio odwrotnie I Mapedby Adnotacje. Adnotacje te są używane do poinformowania doktryny, jaką własność, po drugiej stronie relacji, odnosi się do obiektu: odwrotnie musi być używany z boku, który jest właścicielem Klucz obcy, (W tym przypadku jednostka postu).

Jak widać, w autorze użyliśmy Mapedby, określając to w docelowy byt Post, odpowiednia właściwość to Autor $. Wprowadziliśmy również nowy parametr, kaskada, ustawiając go na „Wszystkie”. Oznacza to, że utrzymując lub usuwając jednostkę z bazy danych, wpłynie również na wszystkie jego posty: na przykład usunięcie użytkownika spowoduje również usunięcie wszystkich jego postów. Jest tym, co definiujemy przez Na usunięciu kaskady W kodzie SQL.

Odwrotnie, w podmiotu postu, który posiada klucz obce w bazie danych, użyliśmy odwrotnie, Mówienie doktryny, że w autorce docelowej autora właściwości, która odnosi się do obiektu, jest posty. Użyliśmy również @Joincolumn adnotacja w wierszu 33, określając kolumny zaangażowane w połączenie SQL, ustawiając klucz obcy jako nie zerowe (NIE JEST ZEREM).

Po zdefiniowaniu związku między dwoma podmiotami musimy zaktualizować metody potrzebne do zarządzania dodanymi właściwościami. Znowu po prostu biegamy:

$ php dostawca/bin/doktryna ORM: generuj elementy .


Wygeneruj schemat bazy danych

W naszym przykładzie mamy wystarczającą ilość danych, aby móc wygenerować nasz schemat bazy danych. Ponownie doktryna może nam pomóc, automatycznie go generować na podstawie naszych adnotacji. Wszystko, co musimy zrobić, to uruchomić następujące polecenie Linux:

$ php dostawca/bin/doktryna ORM: Schema-tool: aktualizacja-Force

Jeśli wszystko pójdzie dobrze, tabele bazy danych zostaną wygenerowane, sprawdźmy to:

Mariadb [(brak)]> Opisz blog.autor; +------------+--------------+------+------+-------- -+ ----------------+ | Pole | Typ | NULL | Klucz | Domyślnie | Dodatkowe | +------------+--------------+------+------+-------- -+ ----------------+ | Id | Smallint (6) | Nie |. Pri | NULL | Auto_increment | |. First_name | varchar (255) | Nie |. |. NULL | |. |. Last_name | varchar (255) | Nie |. |. NULL | |. +------------+--------------+------+------+-------- -+ ----------------+ Mariadb [(brak)]> Opisz blog.post; +-----------+--------------+------+------+--------- + ----------------+ | Pole | Typ | NULL | Klucz | Domyślnie | Dodatkowe | +-----------+--------------+------+------+--------- + ----------------+ | Id | Smallint (6) | Nie |. Pri | NULL | Auto_increment | |. autor_id | Smallint (6) | Nie |. Mul | NULL | |. |. Tytuł | varchar (255) | Nie |. |. NULL | |. |. Tekst | LongText | Nie |. |. NULL | |. |. Data | DateTime | Nie |. |. NULL | | +-----------+--------------+------+-----+---------+----------------+ 
Kopiuj

Zgodnie z oczekiwaniami tabele odpowiadające naszemu podmiotowi zostały wygenerowane i odzwierciedlają określone adnotacje. Kod SQL używany do ich generowania, odpowiednio:

Mariadb [(brak)]> Pokaż Blog Utwórz tabelę.autor; Tabela: Autor Utwórz Tabela: Utwórz tabelę „Autor” („Id” SmallItt (6) Not Null Auto_increment, „First_name” Varchar (255) Załóż UTF8_Unicode_ci Not Null, „Last_name” Varchar (255) Zbieraj UTF8_UNICODE_CI „id”)) silnik = innodb auto_increment = 2 Domyślny charakter = UTF8 canto = UTF8_unicode_ci mariadb [(none)]> Pokaż Utwórz blog Table Blog.post; Tabela: Opublikuj Tabela: Utwórz tabelę „Post” („ID” SmallItt (6) Not Null Auto_increment, „Author_id” SmallItt (6) Not Null, „Title” Varchar (255) Załóż UTF8_unicode_ci Not Null, „Text” LongText Zamoruj utf8_unicode_ci not null, „data” datetime not null, klucz podstawowy („id”), klucz „idx_5a8a6c8df675f31b” („autora_id”), ograniczenie „fk_5a8a6c8df675f31b” klawisz zagraniczny („autora_id”) Engine = Innodb auto_increment = 2 Domyślny charakter = UTF8 celate = utf8_unicode_ci 
Kopiuj

Korzystanie z Entity Manager

Teraz czas pokaż, jak korzystać z Menedżer jednostki:

setFirstName („John”) -> setLastName („Smith”); $ entity_manager-> trwa ($ autor); // Utwórz nowy post $ post = (New Entities \ post ()) -> settitle („hello wold”) -> setText („to jest post testowy”) -> setauthor ($ autor) -> setDate (nowy DateTime ()); // Dodaj post do listy postów autora. Ponieważ użyliśmy cascade = „all”, nie musimy przetrwać postu osobno: będzie on trwał podczas utrzymywania się // autora $ autora-> addPost ($ post); // Wreszcie spłucz i wykonaj transakcję bazy danych $ ENTYTY_MANAGER-> FLUSH (); 
Kopiuj

Wykonując ten kod, stworzyliśmy autora i jego pierwszy post, a następnie dodaliśmy post do kolekcji postów autora i na koniec przetrwaliśmy je do bazy danych. Z trwać() Metoda, że ​​mówimy doktrynę do zarządzania jednostką, podczas gdy faktyczna transakcja bazy danych następuje tylko podczas dzwonienia spłukać(). Jeśli teraz spojrzymy na autor I post Tabela, widzimy, że w obu przypadkach istnieje nowy rekord:

Mariadb [(brak)]> Wybierz * z blogu.autor; +----+------------+-----------+| Id | First_name | Last_name | +----+------------+-----------+| 1 | John | Smith | +----+------------+-----------+mariadb [(brak)]> Wybierz * z blogu.post; +----+-----------+------------+------------------- -+ ---------------------+ | Id | autor_id | Tytuł | Tekst | Data | +----+-----------+------------+------------------- -+ ---------------------+ | 1 | 1 | Witaj Wold | To jest post testowy | 2018-04-17 08:37:44 | +----+-----------+------------+---------------------+---------------------+ 
Kopiuj

Na przykład możemy również użyć Menedżera Entity, aby odzyskać istniejącą jednostkę:

// Pobieraj autora po jego nazwisku $ author = $ entity_manager-> getRepository ('entities \ autor')-> findOnby (['last_name' => 'Smith']); 
Kopiuj

Wnioski

Celem tego samouczka było wprowadzenie Cię do wzorca mapowania danych w PHP za pomocą doktryny: Widzieliśmy, jak skonfigurować i uzyskać menedżera jednostki, jak zdefiniować dwa podstawowe jednostki i zdefiniować wspólną relację między nimi za pomocą adnotacji.

Doktryna jest bardzo potężną biblioteką: możesz użyć dokumentacji projektu, aby ją opanować, mam nadzieję, że może to być minimalny punkt wyjścia.

Powiązane samouczki Linux:

  • Rzeczy do zainstalowania na Ubuntu 20.04
  • Instalacja Ampache Raspberry Pi
  • Jak utworzyć stos lampy na bazie Dockera za pomocą Dockera na…
  • Jak zainstalować stos lampy na Almalinux
  • Rzeczy do zrobienia po zainstalowaniu Ubuntu 20.04 Focal Fossa Linux
  • Wprowadzenie do automatyzacji, narzędzi i technik Linuksa
  • Ubuntu 20.04 sztuczki i rzeczy, których możesz nie wiedzieć
  • Mint 20: Lepsze niż Ubuntu i Microsoft Windows?
  • Big Data Manipulacja dla zabawy i zysku Część 1
  • Ubuntu 20.04 WordPress z instalacją Apache