Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wywołanie obiektu na innej podstronie -wzorzec Rejestr
Forum PHP.pl > Forum > PHP
b3rt
Witam,
mam plik konfiguracyjny header.php
i stronę index.php, login.php, registry.php

REGISTRY.php

jest to wzorzec projektowy Rejestr - działa na zasadzie Singleton

  1. abstract class Registry {
  2.  
  3. private static $_tools = array();
  4.  
  5. public static function set($name, $value) {
  6. self::$_tools[$name] = $value;
  7. }
  8.  
  9. public static function get($name) {
  10. return (isset(self::$_tools[$name]) ? self::$_tools[$name] : null);
  11. }
  12.  
  13. }


HEADER.php

  1. $db = new PDO('...');
  2. Registry::set('db', $db);


USER.php

  1. class User
  2. {
  3. ...
  4.  
  5.  
  6. function __construct($login, $haslo) {
  7. $m = Registry::get('db')->query("SELECT * FROM users WHERE `username`='$login', `password`='$haslo' LIMIT 1")->fetch();


W klasie User mogę używać obiektu db do łączenia się z bazą.


LOGIN.php
  1.  
  2. $user = new User($login, $password);
  3. Registry::set('user', $user);


W tym przypadku gdy dodaję obiekt do obiektu Register nie jest on dostępny w każdym miejscu np. w INDEX.php gdzie chciałbym wykonać pewną metodę z klasy User.
W jaki sposób uczynić $user dostępnym w każdym miejscu ? Gdybym w HEADER.php utworzył $user = new User($login, $password) i dodał do Registry to pewnie by zadziałało ale obiekt User ma powstać w chwili zalogowania ... jak rozwiązać taką sytuację ? Jak to się powinno poprawnie robić? Proszę o radę.
CuteOne
UserEntity.php

  1. class UserEntity extends AbstractEntity {
  2.  
  3. private $_id;
  4. private $_username;
  5.  
  6. // dalej settery i gettery
  7. }


Auth.php
  1.  
  2. if($this->_auth->isAuthentication()) {
  3.  
  4. $row = $pdo->fetchRow() //pobierasz dane zalogowanego użytkownika z bazy
  5. $user = new UserEntity($row);
  6.  
  7. }
  8. else {
  9.  
  10. $user = new UserEntity(); // tworzysz pusty obiekt lub wypełniasz go danymi Gościa
  11. }
  12. Registry:: set('user', $user);


index.php
  1. // najpierw autoryzacja użytkownika (Aurh.php)
  2. // potem pobranie obiektu User
b3rt
Jeśli dobrze analizuję Twój kod to wydaje mi się, że mam podobnie, problem jest taki, że np. gdy utworzyłem obiekt user i dodałem go w ten sposób:
  1. Registry::set('user', $user);


Później gdy chcę go wywołać w innym miejscu np. metoda getLogin()

  1. Registry::get('user')->getLogin();


Otrzymuję komunikat:

  1. Fatal error: Call to a member function getLogin() on a non-object in



Pytanie jest takie, czy obiekt powinienem tworzyć w jakimś głównym pliku który jestem headerem a później jest wszędzie includowany ? Czy obiekt możemy tworzyć w dowolnym miejscu i dodawać go tak jak napisałem powyżej "Registry::set('user', $user);" ?

Będę wdzięczny za pomoc
CuteOne
Odpowiedziałeś sobie sam - lepiej rejestrować obiekty już na samym początku (np. w index.php) jeżeli kbędą wywoływane w wielu miejscach aplikacji.

ps. tak jak pisałem w poprzednim poście, najpierw autoryzacja potem działanie na 'user' smile.gif
ps2. nie twórz rejestru podczas logowania. Logowanie to TYLKO sprawdzenie czy podane dane są poprawne i zapis (np. loginu i id użytkownika) do osobnego obiektu - a gdzieś tam dalej do sesji/cookie/bazy.
ps3. jeżeli masz czas to potrenuj na freamworku, dowiesz się jak takie rzeczy robią profesjonaliści
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.