Clicky

Skocz do zawartości


Zdjęcie
- - - - -

[K3] ORM behavior - moduł rozszerzający możliwości ORM

9 odpowiedzi w tym temacie

  • Zaloguj się, aby dodać odpowiedź

#1 phpion

phpion

    Senior Mastah

  • Użytkownik
  • PipPipPip
  • 774 postów
  • Skąd:Sosnowiec, Dąbrowa Górnicza

Napisano 08 wrzesień 2012 - 23:45

Heja,
udostępniam Wam swój kolejny moduł. Tym razem coś dla osób korzystających z ORM - moduł pozwalający na korzystanie z tzw. behaviorsów znanych z innych mechanizmów ORM.

Moduł zawiera przykładowe modele korzystające z przykładowych behaviorów. Przygotowując sobie zestaw behaviorów (komentowanie, obsługa drzewek, wielojęzykowość) można znakomicie uprościć sobie tworzenie kolejnych modeli. To takie rozszerzanie klas bez extend'a.

https://github.com/phpion/orm-behavior
Notifero - Technologie Informatyczne | Warsztat: Kohana 3.x/2.x + PostgreSQL/MySQL | Programista Kohana

#2 lukaskolista

lukaskolista

    Młodszy Mastah

  • Użytkownik
  • PipPip
  • 414 postów

Napisano 10 wrzesień 2012 - 07:45

Ogolnie modul ciekawy i przydatky, ale po ostatnim projekcie mam uraz do wszelkich uniwersalnych mechanizmow. Nie zaglebialem sie w kod i mam pytanie: w SQL nie zauwazylem relacji komentarzy z artykulami, jak rozumiem relacja jest tworzona po stronie php na podstawie unikalnego id obiektu? Nie lepiej by bylo dla kazdej relacji dodawac tabele przejsciowa, tj. n:n? Teraz pisze sobie taka mala aplikacje, w ktorej mam zamiast komentarzy zalaczniki (pliki). Zalacznik mozna przypiac do kilku obiektow i zrobilem to wlasnie na podstawie tabel przejsciowych. Ma to przewage nad Twoim rozwiazaniem, a mianowicie jeden zalacznik moge podpiac pod wiele obiektow, u Ciebie jeden komentarz jest dostepny tylko dla 1 obiektu.

#3 mck

mck

    Jestę Blogerę

  • Admin
  • 1544 postów

Napisano 10 wrzesień 2012 - 08:44

^ Ale akurat komentarz powinien być unikalny. Jak sobie wyobrażasz podpinanie tego samego komentarza do różnych artykułów?
:)

#4 phpion

phpion

    Senior Mastah

  • Użytkownik
  • PipPipPip
  • 774 postów
  • Skąd:Sosnowiec, Dąbrowa Górnicza

Napisano 10 wrzesień 2012 - 08:52

Tak jak pisze mck - komentarz dotyczy 1 konkretnego obiektu. Poza tym przykładowe behaviory to tylko przykłady. Nie skupiałem się za bardzo nad poprawnością rozwiązań czy estetyką kodu. Chodziło mi jedynie o zaprezentowanie przykładowego użycia behaviorów.
Notifero - Technologie Informatyczne | Warsztat: Kohana 3.x/2.x + PostgreSQL/MySQL | Programista Kohana

#5 lukaskolista

lukaskolista

    Młodszy Mastah

  • Użytkownik
  • PipPip
  • 414 postów

Napisano 10 wrzesień 2012 - 09:14

ok, nie mowie tu o komentarzach konkretnie, ale zalozmy, ze te obiekty to z gory zdefiniowane cytaty z ksiazek. Cytat moge przywolac w wielu miejscach i podpiac go pod rozne obiekty.

#6 phpion

phpion

    Senior Mastah

  • Użytkownik
  • PipPipPip
  • 774 postów
  • Skąd:Sosnowiec, Dąbrowa Górnicza

Napisano 10 wrzesień 2012 - 10:26

No ale co to ma do rzeczy, bo nie bardzo rozumiem. Behaviory sprawdzają się w Doctrine czy w Propelu, chciałem zastosować podobny mechanizm w przypadku ORM Kohany. W jaki sposób stworzysz sobie behaviory to już Twoja sprawa. Przykładowa "aplikacja" zawiera kilka różnych ich rodzajów. W zasadzie behavior to w dużej mierze dodanie nowych metod do klasy bazowej (bez konieczności rozszerzania klasy, a jak wiadomo w PHP możesz dziedziczyć po 1 klasie), których wykorzystanie sprowadza się do $obj->method().

Co do przykładu z cytatem: osobiście zrobiłbym nowy model Model_Cytat, którzy zarządzałby cytatami. Model byłby osobnym bytem nijak nie związanym z behaviorem. Stworzyłbym behavior Behavior_Cytatowy ;) który mógłby mieć metody:
- dodaj_cytat(Model_Cytat $cytat)
- usun_cytat(Model_Cytat $cytat)
- pobierz_cytaty()
Metody te operowałyby na tabeli: obiekty_cytaty [id_obiektu, typ_obiektu, id_cytatu]. Wszystkie 3 kolumny składałyby się na klucz główny. dodaj_cytat robi insert do tabeli, usun_cytaty wykonuje delete. Teraz mając obiekt np. $artykul mogę zrobić $artykul->pobierz_cytaty(), co spowoduje wykonanie zapytania pobierającego cytaty dla tego obiektu. Całość działałaby na podobnej zasadzie jak przykładowy behavior komentarzy. Pozostaje jeszcze kwestia usuwania powiązania przy usuwaniu rekordu, ale to można rozwiązać poprzez metodę trigger_before_delete() i po sprawie. Oczywiście w przypadku ręcznego usunięcia wpisu z bazy pozostanie osierocony rekord, ale albo zakładamy, że usuwamy tylko spod administracji serwisem, albo piszemy trigger, albo nie przejmujemy się osieroconymi danymi.
Notifero - Technologie Informatyczne | Warsztat: Kohana 3.x/2.x + PostgreSQL/MySQL | Programista Kohana

#7 lukaskolista

lukaskolista

    Młodszy Mastah

  • Użytkownik
  • PipPip
  • 414 postów

Napisano 10 wrzesień 2012 - 10:36

Rozumiem idee, ale w moim odczuciu modul jest troche za malo elastyczny. Przeciez nie trzeba "kopiowac" doctrine i propela, mozna zrobic cos lepszego :)

#8 phpion

phpion

    Senior Mastah

  • Użytkownik
  • PipPipPip
  • 774 postów
  • Skąd:Sosnowiec, Dąbrowa Górnicza

Napisano 10 wrzesień 2012 - 10:39

Wyedytowałem swoją poprzednią odpowiedź, przeczytaj przykład wykonania cytatów.

W czym moduł jest za mało elastyczny? Czego w nim brakuje, co jest ograniczeniem? Wydaje mi się, że behaviory w większości systemów działają w bardzo zbliżony sposób, więc ciężko zrobić coś lepszego ;)
Notifero - Technologie Informatyczne | Warsztat: Kohana 3.x/2.x + PostgreSQL/MySQL | Programista Kohana

#9 lukaskolista

lukaskolista

    Młodszy Mastah

  • Użytkownik
  • PipPip
  • 414 postów

Napisano 10 wrzesień 2012 - 11:09

W takim razie wszystko jest ok :)

#10 phpion

phpion

    Senior Mastah

  • Użytkownik
  • PipPipPip
  • 774 postów
  • Skąd:Sosnowiec, Dąbrowa Górnicza

Napisano 10 wrzesień 2012 - 11:41

Czy jest ok to się okaże gdy przygotuję kilka behaviorów :) Wówczas w praniu wyjdzie czy czegoś nie trzeba w module dorobić, zmienić.

Generalnie idea wzięła się stąd, że przy jednym projekcie proszono mnie "dodajmy możliwość komentowania zdjęć", potem "dodajmy możliwość komentowania artykułów". Wówczas pomyślałem: może warto spróbować ująć tego typu funkcjonalności w osobne klasy, które można "wpinać" do wybranych modeli nie ingerując za bardzo (wcale?) w metody tych modeli.
Notifero - Technologie Informatyczne | Warsztat: Kohana 3.x/2.x + PostgreSQL/MySQL | Programista Kohana




Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych