Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Ocena podejścia do Dependency Injection, PDO + OOP + Dependency injection
marcinq123
post
Post #1





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 21.01.2013

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


Witam, uczę się OOP, zacząłem dla testów pisać klasę obsługująca bazę na podstawie PDO ( Trudno to nazwać DIC ). I proszę Was o ocenę czy w dobrą stronę to zmierza czy może podejście mam złe i później sobie skomplikuje życie ?

"Klasa DIC"

  1. class DataBaseConnection
  2. {
  3. protected $pdo;
  4. protected $mysqlHost = 'Host';
  5. protected $mysqlLogin = 'Login';
  6. protected $mysqlPassword = 'Haslo do bazy';
  7. protected $mysqlDatabase = 'Baza';
  8. public function __construct()
  9. {
  10.  
  11. try
  12. {
  13. $this->pdo = new PDO('mysql:dbname='.$this->mysqlDatabase.';host='.$this->mysqlHost.';', $this->mysqlLogin, $this->mysqlPassword);
  14. $this->pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
  15.  
  16. }
  17. catch(PDOException $exception)
  18. {
  19. echo $exception->getMessage();
  20. }
  21. }
  22.  
  23. public function prepare($sql)
  24. {
  25. return $this->pdo->prepare($sql);
  26. }
  27.  
  28. }


Pomijając kwestię iż trzymam dane do połączenia w klasie, czy ma mniej więcej tak to wyglądać ? Ciekawi mnie dlaczego musiałem zdefiniować funkcję prepare ... jak jej nie dopiszę to wywala mi później że nie istnieje ;x

Klasa User:

  1. class User
  2. {
  3. private $login;
  4. private $query;
  5. public function __construct($baza)
  6. {
  7.  
  8. $this->pdo = $baza;
  9.  
  10. }
  11.  
  12. public function selectUser($user)
  13. {
  14. $this->login = $user;
  15.  
  16. $this->query = $this->pdo->prepare('SELECT * FROM users WHERE login =:login');
  17. $this->query->bindParam(':login', $this->login, PDO::PARAM_STR);
  18. $this->query->execute();
  19.  
  20. if($this->query->rowCount() > 0)
  21. {
  22.  
  23. $row=$this->query->fetch();
  24. $this->nazwa = $row['data'];
  25. }else{echo ' dupa ';}
  26. }
  27.  
  28.  
  29.  
  30. public function getUserData()
  31. {
  32.  
  33. return $this->nazwa;
  34.  
  35. }
  36.  
  37. }


Kod napisany tylko żeby sprawdzić czy się uruchamia.

A wywołuje metody tak:

  1. $user = new User(new DataBaseConnection());
  2.  
  3. $user->selectUser('jakisUser');
  4. echo $user->getUserData();


Ogólnie działa, no chyba że skasuje metode prepare w klasie DataBaseConnection to wtedy już nie ;p Tylko pytanie jak już wcześniej napisałem czy dobrą drogą idę ?
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%)
-----


Cytat
1. Jeżeli to jest zwykły model do połączenia z bazą danych to jest takowym i w każdym obiekcie i tak będzie się łączył z bazą danych i duplikował przekazywanie połączenia w konstruktorze przecież. Po to ma użyć Singleton, żeby nie miał kilku otwartych połączeń.
Co to jest "zwykły model"? Jeżeli przekazuje za każdym razem to samo połączenie to nie nawiąże mu się nagle kilka.
Cytat
3. Tak sobie przeglądam klasy Doctrine zawierające własnie Singleton np w getInstance i nie widzę idiotyzmu.
A jakoś dokładniej? Bo na pewno nie jest to obiekt połączenia z bazą danych.
Cytat
[...] w zamian za duplikowanie kodu (przekazywanie połączenia za każdy razem, przy tworzeniu obiektu)
Ale tu nie ma żadnego duplikowania kodu.
Go to the top of the page
+Quote Post

Posty w temacie


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

 



RSS Aktualny czas: 12.10.2025 - 19:29