Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> ActiveRecord bez metod statycznych, Pobieranie połączenia DB za pomocą metody statycznej innej klasy
adbacz
post
Post #1





Grupa: Zarejestrowani
Postów: 532
Pomógł: 24
Dołączył: 15.04.2011
Skąd: Kalisz

Ostrzeżenie: (0%)
-----


Jak stworzyć ActiveRecord bez udostępniania połączenia z bazą danych za pomocą statycznej metody innej klasy?

Przykład wykorzystania AR:
  1. $post = new Post;
  2. $post->title = 'przykładowy post';
  3. $post->content = 'zawartość postu';
  4. $post->save();

Aby wykonać taki kod, muszę w klasie Post zrobić dziedziczenie po klasie, np. ActiveRecord, i w tej klasie, a konkretnie w konstruktorze, pobrać połączenie z bazą danych, z jakiejś statycznej metody, która ją udostępnia. Czyli na przykład klasy APP i metody getDatabaseConnection():
  1. class APP
  2. {
  3. private static $db;
  4.  
  5. // static setter...
  6.  
  7. public static function getDatabaseConnection()
  8. {
  9. return self::$db;
  10. }
  11. }


Ale czy jest możliwość stworzenia obiektów ActiveRecord bez pobierania połączenia z DB za pomocą innej metody statycznej? Robi się tutaj bezpośrednie powiązanie, nie tylko metody, ale i nazwy klasy, a to totalnie nie współgra z zasadami SOLID.

A może zamiast tworzyć obiekt normalnie (new Post), robić to za pomocą innej metody, na przykład klasy ActiveRecordFactory, i w niej, po utworzeniu obiektu Post, wstrzyknąć obiekt bazy danych i zwrócić obiekt Post?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Crozin
post
Post #2





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


1. ActiveRecord sam w sobie jest sprzeczny z zasadami SOLID, chociażby poprzez fakt łamania zasady pojedynczej odpowiedzialności obiektu.
2. Jedyne rozwiązanie to wymuszenie by wszystkie obiekty AR implementowały jakiś interfejs, a ich tworzenie przerzucić do jakiejś dodatkowej metody-fabryki, czyli coś w stylu:
  1. interface ActiveRecordEntity {
  2. public function setEverythingNeededForAR(DatabaseInterface $db, ...);
  3. }
  4.  
  5. abstract class ActiveRecord implements ActiveRecordEntity {
  6. ...
  7. }
  8.  
  9. class ActiveRecordFactory {
  10. ...
  11.  
  12. public function create($class, array $args = []) {
  13. $ref = $this->getReflectionClass($class);
  14. $obj = $ref->newInstanceArgs($args);
  15.  
  16. if (!$obj instanceof ActiveRecordEntity) {
  17. throw new ...;
  18. }
  19.  
  20. $obj->setEverythingNeededForAR($this->db, ...);
  21.  
  22. return $obj;
  23. }
  24. }
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 28.12.2025 - 03:32