Frage an OOP Experten

Guten Abend meine lieben,

wie würde ein einfaches Logon Script (ohne iwelche Frameworks oder Hilfen) in OOP aussehen. Welche Klassen würdet ihr da nehmen. Im Internet finde ich war viele Logon Scripts, ist ja auch nicht das Problem. Aber ich will einfach nur mal sehen, wie man sowas schön objektorientiert machen könnte.

Ich würde die Datenbank klasse über ne Factory instanzieren. Ich frag mich nur wo ich die Methode logon zB reinschreiben soll, weil die Datenbank Klasse liefert mir nur eine Intanz von ihr. D.h. sollte ich die Mehtode in die User Klasse mit reinschreiben?
Tipps?
 
Ich würde nen primitiven OR-Mapper bauen, der eine Methode search() anbietet und diese eine Instanz eines DBRecords zurück gibt. Der DBRecord wäre eine abstrakte Klasse, von der User erben würde. Als nächstes bräuchte ich eine Klasse Session, welche die notwendigen Methoden zum einfügen und löschen anbietet. User würde eine Methode isAuthenticated() anbieten, die zwei Parameter erwartet, Name und Passwort.

Jetzt kann man natürlich noch soweit gehen, eine MVC-Klasse zu bauen, aber das würde für so ein einfaches Use-Case den Rahmen sprengen. Im groben könnte man das so skizzieren:

PHP:
DB::getInstance()->setParams($dsn, $dbuser, $dbpass);
if( isset($_POST['login_form_submit']) )
{
  $user = DB::getInstance()->search('User', $_POST);
  if($user->isAuthenticated())
  {
    Session::getInstance()->insert('user', $user);
  } 
}
else
{
  // Form erzeugen
}

Ich würde trotzdem Zend nehmen, da bekommt man das alles geschenkt.
 
Danke, durch den Code hab ich es verstanden, aber der Text war mir zu hart.
OR-Mapper und keine Ahnung was :-)

Ich will einfach nur mal sehen wie man das so machen könnte. Aber vielleicht lern ich es noch durch das Zend Framework, was ich mir aktuell beibringe.
Ich weiß wie OOP eigentlich Grundlegend geht bzw mittlerweile gut, aber wenn ich dann an die Praxis denke wie zB so ein einfaches Login, hab ich keinen Plan in welche Klasse ich was stecken sollte.
Und du hast ja die Methode Search in der DB Klasse anscheined, weil du ja von dort aus instanzierst und gleich suchst. Ich denke die DB Klasse soll in erster Linie nur zum Instanzieren sein (so macht es meine Factory Klasse). Klar gibts mehre Lösungen.

Wisst ihr was das schlimme ist, jetzt woch auch das Buch design pattern gelesen hab, denk ich mir immer bei einer neuen klasse, ob das schon alles austauschbar ist, ob es gut ist, ob es unabhängig ist. Und jetzt scheitere ich bei einem einfachen Login System, was ich eben gerne über MVC machen würde (ausßer dem View, das anzeigen in html interessiert mich nicht).

Aber dein Code hilft mir schon mal vielen Dank
 
Nur zur Info: Ein OR-Mapper ist die Schnittstelle zur Datenbank. Ausgeschrieben lautet das Akronym Object-Relational also die Beziehung zwischen PHP-Klasse und Datenbank. Hier ein Beispiel:

Tabelle "users"
Code:
id int not null primary key,
name char(30),
passwd char(50),
created timestamp

Die ORM-Klasse wäre dann ungefähr so:

PHP:
class User extends DBRecord
{

  private $_tableName = 'users';

  private $_id;
  private $_name;
  private $_passwd;
  private $_created;

  protected function __construct(array $data)
  {
    $this->_id = $data['id'];
    // usw...
  }

  // Setter für Attribut id
  public function setId($id)
  {
    $this->_id = (int)$id;
  }

  // Getter für Attribut id 
  public function getId()
  {
    return $this->_id;
  }

  // usw...

  public function search(array $options, $allOrAnyOption = 'all')
  {
    // Basis-Query
    $sql = 'SELECT * FROM ' . $this->_tableName;

    // Where-Conditions zusammen bauen
    $searches = array();
    foreach($options as $columnName => $value)
      $searches[] = "$columnName = '$value'";

    $wheres = implode( $allOrAnyOption == 'all' ? ' AND ' : ' OR ', $searches)

    // Search-Methode in DBRecord aufrufen mit $sql und optionalen $wheres, neues User Objekt wird implizit erzeugt. 
    return new User( parent::search($sql, $wheres) );
  }
}
 
Zurück