stable Nette 2.0 a NotORM
- Oggy
- Člen | 306
Trošku se trápím s nahrazením nette/database za notorom v nette 2.0
..
Koukal jsem po fóru, kuchařce apod.. ale nějka více ucelenou informaci
k nejnovější revizi jsem nenašel.
Jak má vypadat config.. jak nejlépe přidat panel, přidat vlastní NotORM_Row implementaci.. zapnout cache apod.
- Oggy
- Člen | 306
tak jsem se dopracoval k něčemu takovémuto:
Pochopil jsem konfiguraci správně?
config.neon
<?php
nette:
notormConnection:
class: NotORM_Connection
arguments: ['@notorm']
services:
notorm:
factory: NotORM_Connection::initialize
?>
NotORM_Connection
<?php
use Nette\Diagnostics\Debugger, \Nette\DI\IContainer;
/**
* Description of NotORM_Connection
*
* @author Petr Ogurcak <petr.ogurcak.cz>
*/
class NotORM_Connection {
protected $container;
/**
*
* @param IContainer $container
*/
public function __construct($container) {
$this->container = $container;
}
/**
*
* @param IContainer $container
* @return NotORM
*/
public static function initialize(IContainer $container) {
$database = $container->parameters['database'];
$dsn = (isset($database['port']))
? "{$database['driver']}:host={$database['host']};dbname={$database['dbname']};port={$database['port']}"
: "{$database['driver']}:host={$database['host']};dbname={$database['dbname']}";
$pdo = new PDO($dsn,$database['user'], $database['password']);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->query('SET NAMES utf8');
$notORM = new NotORM($pdo, null, new NotORM_Cache_File($container->parameters['tempDir'] . "/notorm.cache"));
$notORM->rowClass = 'NotORM_RowLang';
if(!$container->parameters['productionMode']) {
$panel = Panel::getInstance();
$panel->setPlatform($database['driver']);
Debugger::addPanel($panel);
$notORM->debug = function($query, $parameters) {
Panel::getInstance()->logQuery($query, $parameters);
};
}
return $notORM;
}
}
?>
Řešili byste to jinak? Používáte NotORM namísto nette/database?
A ještě ke konfiguraci.. kdy zapisovat do sekce nette? a kdy do služeb?
- Tomáš Votruba
- Moderator | 1114
Tak místo flákání jsem zkusil sepsat něco do Kuchařky s NotORM a Nette 2.0 – rád bych zde pracoval na jeho zlepšení. Máš-li tedy nějaké návrhy, sem s nimi.
Použití NotORM_Row by mne také zajímalo.
(Edit: typo)
Editoval Schmutzka (27. 2. 2012 2:00)
- Tharos
- Člen | 1030
@hrach: No vidíš, a jsou lidi, kteří ještě teď
přecházejí
z Nette\Database
na NotORM… Čert se v tom vyznej. :) Ale třeba
jenom z hlediska API prostě někomu NotORM může vyhovovat více.
Třeba mně osobně… Z ukecanějšího zápisu Nette\Database
pro mě neplynou žádné výhody. Čitelnost obou API (ve smyslu snadného
pochopení obsažných myšlenek) je IMHO naprosto zoufalá (zkrátka jako
u rozsáhlejších SQL dotazů, s tím prostě nikdo nic nenadělá) a pak už
tedy radši volím tu super úsporu znaků typu
$notorm->user[array('username' => $username)]
. :)
Editoval Tharos (23. 2. 2012 10:42)
- Oggy
- Člen | 306
Já si na NotORM zápis zvykl, umí toho zatím ještě více viz http://sql-cross-queries.freexit.eu/notorm/nettedb/
- Tharos
- Člen | 1030
(Nebyl to dotaz na mě, ale…) Já ho připojuji trochu jinak, mám pro
NotORM napsanou Config\Extensions\NotORMExtension
. Přijde mi to
jako nejpraktičtější (a nejlépe znovupoužitelné) řešení. To, co je
teď v kuchařce
se mi z několika důvodů vysloveně nelíbí. No a to, co je tady nahoře, mi
přijde trochu zmatené. Proč vůbec cpát NotORM do „jmenného prostoru“
Nette extenze… No, jsem já to ale kritik. :)
Až bude čas, možná bych tu svou extenzi mohl někam umístit…
- Tomáš Votruba
- Moderator | 1114
hrach napsal(a):
Už jsem zvyklý, že ti to hrozně trvá a nakonec to musím udělat sám :D.
To vidím jako silnou výhodu u NotORM, jakmile ho člověk jednou pochopí, může si ho upravit k obrazu svému a všemožně vylepšovat. NDB z Nette jen tak vyjmout nejde, resp. pro neustálý vývoj a debugování, by to bylo hrozně na nervy. Stejně jako Nette umožňuje nadstavbu nad sebou a díky tomu je tak kvělé.
Navíc Kuba je programátorská elita, takže je radost jeho výtvory používat.
- duke
- Člen | 650
@hrach Co je to git log vím, ale těšil jsem se na slibovaný
diktát z fleku. Místo toho jsem byl z fleku odkázán na git. :-)
Je mi jasné, že seznam tvých commitů také leccos napoví, ale nejspíš
není vše jen o chybách v NotORM. Nebo u každého commitu, kde jde
o chybu již v NotORM, to upřesňuješ v popisu?
- duke
- Člen | 650
Díky.
Také jsem si všiml, žes něco opravoval s columns cache. Před časem mi NotORM columns cache v některých případech nefungovala podle představ a na mé otázky na NotORM fóru nikdo nereagoval. Jde o to, že se v některých případech cache špatně updatuje (ve smyslu přepisuje místo doplňuje), což vede k většímu počtu dotazů (fallbacky na SELECT *). Toto je také v Nette\Database opraveno?
- duke
- Člen | 650
Tomu rozumím a nijak jsem to nezpochybňoval. Jde o to, že v NotORM je implementace tohoto zabugovaná. Právě jsem otestoval chování v Nette\Database a zdá se, že ta je v tomto ohledu v pořádku.
Konkrétně jde o tento kód:
$applications = $db->table('application');
$application = $applications[1];
$web = $application['web'];
$application2 = $applications[2];
$slogan = $application2['slogan'];
NotORM se narozdíl od Nette\Database nikdy nezadaptuje a bude neustále opakovat 3 následující dotazy:
SELECT id, slogan FROM application WHERE (id = 1)
SELECT * FROM application WHERE (id = 1)
SELECT id, slogan FROM application WHERE (id = 2)
Pak jsem ještě otestoval related na tabulce application_tag, a tam mi to v NotORM funguje dobře, ale v Nette\Database jen při prvním spuštění (dokud není vytvořená cache). Zřejmě se Nette\Database narozdíl od NotORM neumí vyrovnat s tím, že tabulka application_tag má dvou-sloupcový primární klíč. Takže alespoň v tomto zatím NotORM vede. :-)
Pozn.: Testoval jsem to na MySQL.