Model pro práci s tabulkou Users

Rudolf Svátek 2016-06-28 12:05

Jako vždy, tak i dnes si můžeš stáhnout celou aplikaci tak, jak by měla vypadat po dnešní kapitole: kapitola5.zip.

BaseMapper a BaseRepository už máme z minula. Dnes tedy vyrobíme Mapper, Repositář a Entitu pro tabulku Users.

UsersEntity

Tabulka users má 9 polí:

  • id jako primární klíč
  • username pro uživatelské jméno
  • password pro uložení hesla v hashované podobě
  • name pro křestní jméno uživatele
  • lastname pro příjmení
  • email pro emailovou adresu
  • role pro definici uživatelských oprávnění
  • passwordHash kvůli obnově zapomenutého hesla
  • passwordHashValidity kvůli obnově zapomenutého hesla

Objekt tedy bude mít 9 atributů a jim odpovídajících 9 funkcí pro čtení, nebo nastavení hodnoty. Kvůli technice, kterou zmíním v některém dalším dílu, budeme vytvářet i Interface.

Tak prvně interface. Vytvoř soubor app\model\Users\IUsersEntity.php. Vlož kód:

<?php
 
namespace App\Model;
 
interface IUsersEntity 
{
 
    public function id();
 
    public function username();
 
    public function password();
 
    public function name();
 
    public function lastname();
 
    public function email();
 
    public function role();
 
    public function passwordHash();
 
    public function passwordHashValidity();
}

Jde o jednoduchý interface, který vyžaduje 9 metod. Metody se shodují s názvy polí v tabulse Users.

Následně vytvoř soubor app\model\Users\UsersEntity.php:

<?php

namespace App\Model;

class UsersEntity extends \Nette\Object implements IUsersEntity
{

	private $id;
	private $username;
	private $password;
	private $name;
	private $lastname;
	private $email;
	private $role;
	private $passwordHash;
	private $passwordHashValidity;

	public function id($id = null) {
		if (!is_null($id))
			$this->id = $id;
		return $this->id;
	}

	public function username($username = null) {
		if (!is_null($username))
			$this->username = $username;
		return $this->username;
	}

	public function password($password = null) {
		if (!is_null($password))
			$this->password = $password;
		return $this->password;
	}

	public function name($name = null) {
		if (!is_null($name))
			$this->name = $name;
		return $this->name;
	}

	public function lastname($lastname = null) {
		if (!is_null($lastname))
			$this->lastname = $lastname;
		return $this->lastname;
	}

	public function email($email = null) {
		if (!is_null($email))
			$this->email = $email;
		return $this->email;
	}

	public function role($role = null) {
		if (!is_null($role))
			$this->role = $role;
		return $this->role;
	}

	public function passwordHash($passwordHash = null) {
		if (!is_null($passwordHash))
			$this->passwordHash = $passwordHash;
		return $this->passwordHash;
	}

	public function passwordHashValidity($passwordHashValidity = null) {
		if (!is_null($passwordHashValidity))
			$this->passwordHashValidity = $passwordHashValidity;
		return $this->passwordHashValidity;
	}

}

Možná, že používáš settery a gettery. Já je sloučil do jedné funkce, takže když potřebuji nastavit atribut email na hodnotu info@email.cz, zavolám metodu

$usersEntity->email("info@email.cz")

Když potřebuji zjistit hodnotu atributu email, zavolám metodu bez argumentů:

echo $usersEntity->email()

UsersMapper

Mappery budou dědit ze třídy BaseMapper. V případě UsersMapper nepotřebujeme umět nic jiného, než co umí BaseMapper, takže vytvoř soubor app\models\UsersMapper.php:
<?php
 
namespace App\Model;
 
use Dibi\Connection;
 
class UsersMapper extends BaseMapper {
 
	/**
	 * @param Connection $db
	 */
	public function __construct(Connection $db) {
		parent::__construct($db);
	}
 
}

Na řádku 5 vidíš užití Dibi pro práci s databází. Toho se pak využívá v konstruktoru. Jde o Dependency Injection, o kterém si zase dobře počteš na stránkách Nette.

UsersRepository

Repozitáře opět dědí z BaseRepository a pak jen řeším individuální požadavky. V případě UsersRepository mi opět stačí jen konstruktor v souboru app\model\Users\UsersRepository.php:

<?php

namespace App\Model;

/**
 * Class UsersRepository
 * @package App\Model
 */
class UsersRepository extends BaseRepository {

	/** @var UsersMapper */
	private $mapper;

	/**
	 * UsersRepository constructor.
	 * @param UsersMapper $mapper
	 */
	public function __construct(UsersMapper $mapper) {
		parent::__construct($mapper);
		$this->mapper = $mapper;
	}

}

Stačí jen předat správný mapper konstruktoru a je to.

Princip Dependency Injection říká, že stačí závislost předat a nestarám se odkud se vezme. Pokud ji nezná sám objekt, někdo mu při vzniku řekne, odkud závislosti získat. Ale někde prostě musí být natvrdo uvedeno, jak má daná závislost vypadat. A to je v konfiguraci. Už jsme ji párkrát upravovali a doplňovali služby.

Vypisuji tu kódy, kde v konstruktoru vkládám nějaké Connection nebo UsersMapper a vlastně nevím kde se berou. Abych byl bez starostí, tak stačí vytvořit službu pomocí zápisu do app\config\config.neon. Do sekce services přidej 2 řádky:

services:
	- App\Model\UserManager
	- App\Forms\FormFactory
	- App\Forms\SignInFormFactory
	- App\Forms\SignUpFormFactory
	usersMapper: App\Model\UsersMapper
	- App\Model\UsersRepository(@usersMapper)
	router: App\RouterFactory::createRouter
	database: Dibi\Connection(%database%, "mysqli")
	database.panel: Dibi\Bridges\Tracy\Panel
	cacheStorage:
		class: Nette\Caching\Storages\DevNullStorage

Funguje to skvěle:

  • připojí se databáze. Tu potřebuje UsersMapper (potažmo každý mapper)
  • z každého mapperu vytvoříme službu (zatím máme jen UsersMapper)
  • repositář zase potřebuje vědět, s jakým mapperem bude spolupracovat. Takže zase vytvoříme službu pro každý repositář.

O nic dalšího se nestarám a všechno jede tak nějak samo.

Jako vždy, tak i dnes si můžeš stáhnout celou aplikaci tak, jak by měla vypadat po dnešní kapitole: kapitola5.zip.

V další kapitole začneme pracovat na administraci uživatelů.

Redakční systém RS::RS Předchozí kapitola

Databázový model

Redakční systém RS::RS Celý seriál

Vývoj redakčního systému v PHP

Redakční systém RS::RS Následující kapitola

Administrace uživatelů

Komentáře (0)

Přidej svůj komentář

O mně

Jmenuji se Rudolf Svátek. Jsem lektor výpočetní techniky a PHP programátor. Stavím firemní stránky a eshopy. Aby se mi to dělalo pohodlně, vytvořil jsem redakční systém RS::RS, který ti tu nabízím k použití.

Rychlý kontakt na mně

  • Rudolf Svátek
  • Telefon:
    +420 777 828 353
  • Email:
  • Adresa:
    Josefa Hory 1097/5
    736 01 Havířov
    ČR



Tyto stránky používají Cookies. Používáním stránek s tím souhlasíte Další informace