Autor Zpráva
Tirus
Profil
Lidi, prosím, dalo by se to zlepšit? Je to má první třída a snaha o OOP...
<?php

class Users {

    protected $registry;
    protected $view;
    protected $args;

    public function __construct($registry) {
        $this->registry = $registry;
        $this->registry = $registry;
        $this->view = $this->registry['view'];
        $this->args = $this->registry['args'];
    }

    //registrace
    function registrate($login, $password, $email, $name, $msn, $icq) {
        $password = $this->passHash($password, $login);
        $ssid = sha1($password . $login);
        $arr = array(
            'nick' => $login,
            'password' => $password,
            'email' => $email,
            'name' => $name,
            'icq' => $icq,
            'msn' => $msn,
            'ssid' => $ssid,
        );
        if (dibi::query('INSERT INTO [' . DB_PREFIX . 'users]', $arr)) {
            return TRUE;
        } else {
            return FALSE;
        }
    }

    //přihlášení
    function login($login, $password) {
        $result = dibi::query("SELECT [ssid],[nick],[password] FROM [" . DB_PREFIX . "users] WHERE %and ", array("nick" => $login, "password" => $this->passHash($password, $login)));
        $count = count($result);
        if ($count <= 1) {
            foreach ($result as $polozka) {
                $_SESSION['SSID'] = $polozka['ssid'];
                $_SESSION['login'] = $polozka['nick'];
                $_SESSION['SSP'] = $polozka['password'];
                continue;
            }
            return TRUE;
        } else {
            return FALSE;
        }
    }

    //kontrola zda je uživatel přihlášen
    function is_logged() {
        if (isset($_SESSION['SSID']) AND isset($_SESSION['login']) AND isset($_SESSION['SSP'])) {
            if ($_SESSION['SSID'] == sha1($_SESSION['SSP'] . $_SESSION['login'])) {
                return TRUE;
            } else {
                return FALSE;
            }
        } else {
            return FALSE;
        }
    }

    //odhlášení uživatele
    function logout() {
        unset($_SESSION['SSID']);
        unset($_SESSION['SSP']);
        unset($_SESSION['login']);
    }

    // Získání hash pro heslo
    function passHash($password, $nick) {
        return sha1($nick . sha1($password));
    }

}

Jan Tvrdík
Profil
1) Třída by se měla jmenovat spíš UserManager nebo UserModel.
2) Vlastnosti $registry, $view a $args se vůbec nepoužívají.
3) 10. a 11. řádek provádí to samé.
4) Metodu registrate přejmenuj na register, slovo registrate neexistuje.
5) Doplň k jednotlivým metodám modifikátory přístupu.
6) Metodu passHash přejmenuj na generatePasswordHash
7) Logika generování SSID by měla být ve zvláštní metodě.
Tirus
Profil
Jan Tvrdík:
takže zda to chápu, tak konstruktor a protected $registry, apod.. mám odstranit.. ovšem nepochopil jsem 5tý bod
Jan Tvrdík
Profil
Tirus:
Modifikátory přístupu jsou public, protected a private.

Celé by to mohlo vypadat třeba takto:
<?php
class UserManager
{
    /**
     * Zaregistruje uživatele.
     */
    public function register($login, $password, $email, $name, $msn, $icq)
    {
        $passwordHash = $this->generatePasswordHash($password, $login);
        $ssid = $this->generateSessionId($passwordHash, $login);        
      
        return (bool) dibi::query('INSERT INTO [' . DB_PREFIX . 'users]', array(
            'nick' => $login,
            'password' => $passwordHash,
            'email' => $email,
            'name' => $name,
            'icq' => $icq,
            'msn' => $msn,
            'ssid' => $ssid,
        ));
    }

    /**
     * Přihlásí uživatele.
     */
    public function login($login, $password)
    {
        $user = dibi::fetch('
            SELECT [ssid], [nick], [password]
            FROM [' . DB_PREFIX . 'users]
            WHERE %and', array(
                'nick' => $login,
                'password' => $this->generatePasswordHash($password, $login)
            )
        );
        if ($user === FALSE) return FALSE;
        $_SESSION['SSID'] = $user['ssid'];
        $_SESSION['login'] = $user['nick'];
        $_SESSION['SSP'] = $user['password'];
        return TRUE;
    }

    /**
     * Vrátí TRUE, pokud je uživatel přihlášen, jinak FALSE.
     */
    public function is_logged()
    {
        if (!isset($_SESSION['SSID'], $_SESSION['login'], $_SESSION['SSP'])) {
            return FALSE;
        }

        return ($_SESSION['SSID'] == $this->generateSessionId($_SESSION['SSP'], $_SESSION['login']));
    }

    /**
     * Odhlásí uživatele.
     */
    public function logout()
    {
        unset($_SESSION['SSID']);
        unset($_SESSION['SSP']);
        unset($_SESSION['login']);
    }

    /**
     * Vygeneruje hash pro heslo.
     */
    private function generatePasswordHash($password, $nick)
    {
        return sha1($nick . sha1($password));
    }

    /**
     * Vygeneruje SSID.
     */
    private function generateSessionId($passwordHash, $nick)
    {
        return sha1($passwordHash . $nick);
    }
}
Tirus
Profil
Jan Tvrdík:
tak jsem to pochopil správně.. ovšem abych se ujistil

private -> dostupný pouze v této tříde
protected -> toto netuším
public -> dostupný odkudkoliv (z celé aplikace)
Jan Tvrdík
Profil
Tirus:
http://ondrej.mirtes.cz/blog/programovani/php-5-oop-cheatsheet-tahak/#toc-viditelnost-zapouzdreni
Tirus
Profil
Jan Tvrdík:
děkuji moc, jinak se optám, pochopil jsem to OOP apoň trochu z tvého pohledu?
Jan Tvrdík
Profil
Tirus:
Řekl bych, že jsi na dobré cestě.
Tirus
Profil
Jan Tvrdík:
děkuji...
až něco zase sesmolím, tak to sem dám a uvidím zda to už chápu :) .. ale děkuji za takovej nákop do začátku :)
Toto téma je uzamčeno. Odpověď nelze zaslat.