stable Nette 2.0 a NotORM

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Oggy
Člen | 306
+
0
-

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
+
0
-

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
+
0
-

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)

hrach
Člen | 1834
+
0
-

Zajimal by me jediny duvod, proc notorm chces pouzivat. Nedoporucuji. Je zabugovane (skoro i vic) nez ndb, akorat to tam nikdo neresi… Tady jsem ti k dispozici ja.

Tharos
Člen | 1030
+
0
-

@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
+
0
-

Já si na NotORM zápis zvykl, umí toho zatím ještě více viz http://sql-cross-queries.freexit.eu/notorm/nettedb/

redhead
Člen | 1313
+
0
-

@Tharos: Já v Nette\Database narazil na situaci (už si ale nevzpomínám, co to přesně bylo), kdy mi vrátil správně 2 řádky (dle DB panelu), ale vyrenderoval ve foreachi pouze jeden. Vůbec jsem nechápal proč. Když jsem to přepsal do NotORM, šlo to… tak proto.

Oggy
Člen | 306
+
0
-

@redhead . a jak notorm připojuješ? podobné postupy jaké tu padly?

Tharos
Člen | 1030
+
0
-

(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…

Oggy
Člen | 306
+
0
-

@tharos .. zmatené to je .-).. trošku se tak i seznamuju s konceptem DI a konfigurace, proto jsem to dal jsem. Moc rád bych viděl jiná ..lepší.. řešení.

Tomáš Votruba
Moderator | 1114
+
0
-

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.

hrach
Člen | 1834
+
0
-

Schmutzka: Z fleku ti ted nadiktuju bugy v notorm, ktere nejsou opraveny a kdovi kdy budou. V NDB jsou fixed. O naprosto „mimo“ discovery structure v notormu radej ani nic rikat nebude ;)

Ohledne meho „trvani“: bugy opravuji do dvou dnu…

duke
Člen | 650
+
0
-

Tak diktuj, to se hodí vědět. :-)
A kdo ví, třeba tvůj diktát urychlí opravy. :-)

hrach
Člen | 1834
+
0
-

@duke rika se tomu git log.

duke
Člen | 650
+
0
-

@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?

hrach
Člen | 1834
+
0
-
  • nefunguje opakovany related call
  • related call pri prochazeni nemeni active prvek, tzn. pri dotahovani chybejicich sloupcu to spadne
  • discovery structure nefunguje na sqlite, ale zadnou chybu to nehodi
duke
Člen | 650
+
0
-

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?

hrach
Člen | 1834
+
0
-

Pokud chybí sloupec, vždy se provede nový select s *. To je nejoptimálnější. Další request samozřejmě už má výběr opravený.

duke
Člen | 650
+
0
-

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.

hrach
Člen | 1834
+
0
-

Postni pripadne kod, co ti nefunguje v ndb. Idealne nove vlakno. Diky.

duke
Člen | 650
+
0
-

Ok, viz zde.