Konfigurační soubor config.neon

Allconius
Člen | 317
+
0
-

Ahoj,
jsem úplný začátečník a mám problém s konfiguračním souborem. Nastavil jsem si v něm spojení do databáze:

database:
dsn: 'mysql:host=xxxxxx;port=3311;dbname=xxxxxx'
user: xxxxx
password: xxxxxxx

options:
PDO::MYSQL_ATTR_COMPRESS: true
lazy: true # navázání připojení až když je poprvé potřeba
 # driverClass: .... třída ovladače databáze

debugger: true # zobrazí panel v Tracy baru
explain: true # explain dotazů v Tracy bar
autowired: true # povoleno u prvního spojení
 conventions: discovered # nebo 'static' nebo jméno třídy, výchozí je 'discovered'

cílem bylo používat Database Explorer. Ve scriptu pak mám:

<?php
class Model
{
    private $database;

    // pro práci s vrstvou Database Explorer si předáme Nette\Database\Context
    public function __construct(Nette\Database\Connection $database)
    {
        $this->database = $database;
    }
}

$prestupky = $context->table('p_t');

foreach ($prestupky as $prestupek) {
    echo $prestupek->id;
    echo $prestupek->cislo;
}
?>

ale nevytvoří mi to ten $context a skončí chybou: Fatal Error: Call to a member function table() on null

pokud vytvořím spojení přes:

<?php
$database = new Nette\Database\Connection($dsn, $user, $password);
?>

a pak dotaz:

<?php
$result = $database->query('SELECT .....
?>

tak mi to funguje

Gappa
Nette Blogger | 209
+
0
-

Ahoj,

je potřeba třídu Model zaregistrovat jako službu:

Přidat tedy do config.neon něco jako toto (pro tento případ, nevidím tam žádný namespace):

services:
    - Model

Píšu to z hlavy, tak snad jsem to trefil :)

David Matějka
Moderator | 6445
+
0
-

ahoj, dle tveho prispevku to vypada, ze pises ten kod mimo tridu. abys pochopil zakladni principy, projdi si nejprve quickstart

CZechBoY
Člen | 3608
+
0
-

Kde se vzala ta promenna $context?
A vis o tom ze si mas v konstruktoru vyzadat Nette\Database\Context a vyzadujes Connection?

Editoval CZechBoY (11. 9. 2018 9:30)

Allconius
Člen | 317
+
0
-

Ahoj, díky za „nakopnutí“, už to funguje ;-)

<?php
$tempDir = 'tmp';
$dsn = 'mysql:host=xxxxx;port=3311;dbname=xxxx';
$user = 'xxxxx';
$password = 'xxxxx';

$storage = new Nette\Caching\Storages\FileStorage($tempDir);
$connection = new Nette\Database\Connection($dsn, $user, $password);
$structure = new Nette\Database\Structure($connection, $storage);
$conventions = new Nette\Database\Conventions\DiscoveredConventions($structure);
$database = new Nette\Database\Context($connection, $structure, $conventions, $storage);


$prestupky = $database->table('p_t');

foreach ($prestupky as $prestupek) {
    echo $prestupek->id;
    echo $prestupek->cislo;



}
?>
Allconius
Člen | 317
+
0
-

jen ještě dotaz, když chci spojení do více DB musím vytvořit zase:

<?php
$tempDir1 = 'tmp';
$dsn1 = 'mysql:host=xxxxx;port=3311;dbname=DB1';
$user1 = 'xxxxx';
$password1 = 'xxxxx';

$storage1 = new Nette\Caching\Storages\FileStorage($tempDir1);
$connection1 = new Nette\Database\Connection($dsn1, $user1, $password1);
$structure1 = new Nette\Database\Structure($connection1, $storage1);
$conventions1 = new Nette\Database\Conventions\DiscoveredConventions($structure1);
$database1 = new Nette\Database\Context($connection1, $structure1, $conventions1, $storage1);


$data= $database1->table('jina_tabulka');

foreach ($data as $zaznam) {
    echo $zaznam->id;
    echo $zaznam->cislo;



}
?>

nebo existuje něco jako $connection->changeDB(‚DB1‘) ? ;-)

CZechBoY
Člen | 3608
+
+1
-

Precti si ten quickstart, tohle je hroznej kod :-).
Zacni pouzivat tridy a dependency injection.