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
marcinq123
post
Post #2





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

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


Prawdę mówiąc, po cichu liczyłem na Twoją odpowiedź Crozin ;]

Z racji tego iż chcę nabrać dobrych nawyków, spróbuje podejść kompleksowo.

Cytat
4. Musiałeś zdefiniować dla klasy DataBaseConnection metodę prepare bo dlaczego niby miałaby ona istnieć sama z siebie? Obiekt PDO udostępnia prepare(), query(), beginTransaction() i masę innych, nie DataBaseConnection.

No właśnie zdefiniowałem tylko prepare() a np. execute(), bindParam() już nie musiałem bo działało ... i dlatego nie rozumiem czemu.


Cytat
Pomijam tutaj już fakt, że wybieranie danych z bazy i ich reprezentacja w formie jednego obiektu klasy User jest bardzo złym podejściem. Powinieneś mieć raczej jeden obiekt przeznaczony do reprezentowania użytkownika (User) i drugi do wybierania takowych np. z bazy danych, czyli tzw. "model" (UserRepository).


Cenna uwaga, ale napisałem przykład z pierwszego postu tylko żeby sprawdzić czy w ogóle to działa.

  1. // Klasa DataBaseConnection w ogóle do kosza.
  2.  
  3. class User
  4. {
  5. private $pdo;
  6.  
  7. private $name;
  8.  
  9. public function __construct(PDO $pdo)
  10. {
  11. $this->pdo = $pdo;
  12. }
  13.  
  14. public function select($login)
  15. {
  16. $stmt = $this->pdo->prepare('SELECT ... ');
  17. $stmt->bind(..., $login);
  18. $stmt->execute();
  19.  
  20. if ($stmt->rowCount() === 0) {
  21. throw new ...Exception('...');
  22. }
  23.  
  24. $data = $stmt->fetch();
  25.  
  26. $this->name = $data['name'];
  27. }
  28.  
  29. public function getName()
  30. {
  31. return $this->name;
  32. }
  33.  
  34. //oraz inne metody
  35. }


Czyli teraz odwołuje się tak ?:


  1. $user = new User(new PDO('mysql:dbname=base;host=host;', 'user', 'password'));
  2. $user->select('user');
  3. echo $user->getName();


Moje pytanie brzmi, dajmy na to miałbym klasy User ... Admin, Auth, etc. ( nie wiem co tam jeszcze wymyśle (IMG:style_emoticons/default/tongue.gif) )
Każdy obiekt generuje ( w razie potrzeby połączenia z bazą) poprzez

  1. $admin= new Admin(new PDO('mysql:dbname=base;host=host;', 'user', 'password'));
  2. //jakieś wywoływane metody


A czy takie podejście żeby się nie powtarzać ma sens?
  1. $connection = new PDO('mysql:dbname=base;host=host;', 'user', 'password'));
  2. $admin= new Admin($connection);





A do reszty się nie ustosunkuje bo ze wstydu nie wiem nawet co powiedzieć (IMG:style_emoticons/default/oneeyedsmiley02.png)
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: 14.10.2025 - 19:15