Nette - příklad na databázi MySQL

Datum vydání: 2014-02-20 17:20:55; aktualizováno: 2014-06-24 14:40:00

Příklad QuickStart

Jednoduchý komplexní příklad s komunikací s databází ve frameworku Nette je součástí QuickStartu, jehož zdrojový kód je umstěn na GitHubu včetně příkazů pro databázi database.sql. Bohužel není součástí staženého zipu samotné Nette. Teprve po dokopírování starší verze Nette (např. NetteFramework-2.0.8, adresář sandbox/libs) do adresáře libs a zprovoznění databáze je projekt funkční.

Já jsem však zkoušela příklad, který je součástí instalace Nette, a to CD-collection. Na ten se nyní zaměřím a upravím ho pro přístup k databázi, místo toho, aby načítal data ze souboru. Tento příklad je asi lepší než QuickStart, pokud jde o návrh aplikace v Nette. Data zde obsluhuje opravdu Model a nikoli Presenter, a kontrola autentizace uživatele je umístěna ve funkci startup() a nikoli pokaždé při zpracování formuláře, jako je tomu u QuickStartu. V CD-collection je zde využita novější verze Nette, odkaz na ni vede z adresáře vendor. QuickStart na druhou stranu ukazuje, jak propojit více tabulek a vytvořit stránkování.

CD-collection pro připojení k databázi používá Class Context, která vypadá nověji než dříve používaná Class Connection. Class Connection obsahuje dle API spoustu metod již označených deprecated.

Příklad CD collection – data v demo.db3

Nette Framework 2.1.1 obsahuje vzorový příklad na obsluhu tabulky Albums (přidání záznamu, editaci a výmaz záznamu). Příklad je umístěný v adresáři NetteFramework-2.1.1/examples/CD-collection. Příklad je funkční ihned, nemusíte zakládat žádnou databázi a tabulky. Je to dáno tím, že se využívá uložení dat ve formě lokálního souboru CD-collection/app/model/demo.db3. Toto je pro okamžité vyzkoušení výhodné, bohužel v praxi potřebujeme komunikovat většinou přímo s databází MySQL.

Převod dat na databázi MySQL

Tento vzorový příklad je možné velice jednoduše modifikovat tak, aby data nebyla uložena v souboru demo.db3, ale na lokální databázi. Stačí přenastavit následující konfiguraci a založit ručně databázi. Počítám zde s lokální verzí databáze nechráněnou heslem.

Změna úložiště dat na MySQL databázi

V souboru CD-collection/app/config.neon změníme

	database:
		dsn: "sqlite:%appDir%/model/demo.db3"

např. na:

	database:
		dsn:		"mysql:host=127.0.0.1;dbname=cd_collection"
		user:		"root"
		password:	""

Vytvoříme databázi a naplníme ji zkušebními daty

V phpMyAdmin vytvoříme databázi cd_collection a pustíme SQL příkaz (jde o export mé databáze):

-- phpMyAdmin SQL Dump
-- version 4.1.4
-- http://www.phpmyadmin.net
--
-- Počítač: 127.0.0.1
-- Vytvořeno: Čtv 20. úno 2014, 18:33
-- Verze serveru: 5.6.15-log
-- Verze PHP: 5.4.24

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";

--
-- Databáze: `cd_collection`
--

-- --------------------------------------------------------

--
-- Struktura tabulky `albums`
--

CREATE TABLE IF NOT EXISTS `albums` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(20) COLLATE utf8_czech_ci NOT NULL,
  `artist` varchar(20) COLLATE utf8_czech_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci AUTO_INCREMENT=5 ;

--
-- Vypisuji data pro tabulku `albums`
--

INSERT INTO `albums` (`id`, `title`, `artist`) VALUES
(3, 'Beauty & Crime', 'Suzanne Vega'),
(4, 'Play', 'Moby');

-- --------------------------------------------------------

--
-- Struktura tabulky `users`
--

CREATE TABLE IF NOT EXISTS `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(20) COLLATE utf8_czech_ci NOT NULL,
  `password` varchar(100) COLLATE utf8_czech_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci AUTO_INCREMENT=2 ;

--
-- Vypisuji data pro tabulku `users`
--

INSERT INTO `users` (`id`, `username`, `password`) VALUES
(1, 'demo', '$1$Fb1.qk5.$JKl6KLwvaYqardZgxbMG50');

Pro přihlašování je použito username demo a heslo xxx. Heslo je v databázi uloženo přes php funkci crypt, proto je v databázi řetězec $1$Fb1.qk5.$JKl6KLwvaYqardZgxbMG50.

<?php
echo crypt('xxx');
?>

Spojení s databází před Model a Presenter

Config.neon a Model

Podle konfiguračního souboru config.neon Nette automaticky vytvoří instanci $database a instance (služby) Model\Authenticator a Model\AlbumRepository. Tyto služby class AlbumRepository při svém vytvoření (volání konstruktoru) obdrží automaticky od Nette jako parametr databázi $database uvedenou v config.neon

public function __construct(Nette\Database\Context $database)

a uloží si ji jako privátní proměnnou $database.

Presenter

Presenter class DashboardPresenter zase dostane do vínku při svém založení příslušný model

public function __construct(Model\AlbumRepository $albums)

a uloží si ho jako svou privátní proměnnou $albums. Prezenter se tak přes Model dostane k obsluze databáze a může s ní pracovat např.

$this->albums->findAll()->order('artist')->order('title');

Spoustu věcí dělá Nette na pozadí, takže ne vše je ihned na první pohled vidět…

Další informace – doc.nette.org

Další informace – jiné zdroje