Nastavení Nette pro připojení DIBI

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

Zdravím, začínám s Nette a rád bych v Nette používal Dibi. Bohužel při nastavování mám problém, že Nette mi vypisuje Cannot redeclare class SystemContainer
Konfiguraci mám následující
bootstrap.php

<?php

/**
 * My Application bootstrap file.
 */
use Nette\Application\Routers\Route,
Nette\Environment;


// Load Nette Framework
require LIBS_DIR . '/Nette/loader.php';
Environment::loadConfig();

// Configure application
$configurator = new Nette\Config\Configurator;

// Enable Nette Debugger for error visualisation & logging
//$configurator->setProductionMode($configurator::AUTO);
$configurator->enableDebugger(__DIR__ . '/../log');

// Enable RobotLoader - this will load all classes automatically
$configurator->setTempDirectory(__DIR__ . '/../temp');
$configurator->createRobotLoader()
	->addDirectory(APP_DIR)
	->addDirectory(LIBS_DIR)
	->register();

// Create Dependency Injection container from config.neon file
$configurator->addConfig(__DIR__ . '/config/config.neon');

$container = $configurator->createContainer();
//dibi::connect($container->params["database"]);
// Setup router
$container->router[] = new Route('index.php', 'Homepage:default', Route::ONE_WAY);
$container->router[] = new Route('<presenter>/<action>[/<id>]', 'Homepage:default');

//připojení dibi

dibi::connect(Environment::getConfig('ukoly'));
// Configure and run the application!
$container->application->run();

config.neon

#
# SECURITY WARNING: it is CRITICAL that this file & directory are NOT accessible directly via a web browser!
#
# If you don't protect this directory from direct web access, anybody will be able to see your passwords.
# https://nette.org/en/security-warning
#
common:
	parameters:
		database:
			driver: mysql
			host: localhost
			dbname: ukoly
			user: root
			password:


	php:
		date.timezone: Europe/Prague
		# session.save_path: "%tempDir%/sessions"
		# zlib.output_compression: yes


	nette:
		session:
			autoStart: smart

		database:
			default:
				dsn: '%database.driver%:host=%database.host%;dbname=%database.dbname%'
				user: %database.user%
				password: %database.password%


	services:
		database: @Nette\Database\Connection

		authenticator: Authenticator( @users )


	factories:
		tasks: Tasks
		users: Users
		tasklists: Tasklists


production < common:

development < common:

config.ini

; SECURITY WARNING: it is CRITICAL that this file & directory are NOT accessible directly via a web browser!
;
; If you don't protect this directory from direct web access, anybody will be able to see your passwords.
; https://nette.org/en/security-warning
;
[common]
; PHP configuration
php.date.timezone = "Europe/Prague"
php.iconv.internal_encoding = "UTF-8"
php.mbstring.internal_encoding = "UTF-8"
;php.default_charset = "UTF-8"

; variables
variable.lang = en
variable.tempDir = %appDir%/temp
variable.logDir = %appDir%/log

; services
service.Nette-Security-IAuthenticator = UsersModel

service.Nette-Loaders-RobotLoader.option.directory[] = %appDir%
service.Nette-Loaders-RobotLoader.option.directory[] = %libsDir%
service.Nette-Loaders-RobotLoader.run = TRUE

db.server = localhost
db.database = ukoly
db.username = root
; db.password = blogtut
db.driver = mysql
db.charset = utf8
db.lazy = TRUE

[production < common]


[development < common]

Mohl by mi prosím někdo poradit, děkuji

Aurielle
Člen | 1281
+
0
-

Vymaž cache.

Taps
Člen | 169
+
0
-

Bohužel vymazání cache nepomohlo

Majkl578
Moderator | 1364
+
0
-

To volání Environment::loadConfig(); hned za načtením Nette je nesmysl.

Taps
Člen | 169
+
0
-

Jak by to tedy mělo být správně ?
Pokud Environment::loadConfig() odmažu tak se začne vypisovat Access denied for user ‚www-data‘@'localhost' (using password: NO)

Etch
Člen | 403
+
0
-

Na první pohled mi přijde, že tam mícháš X věcí dohromady.

  1. config.ini bych úplně vyhodil.
  2. Pokud chceš používat dibi staticky, tak bych to vypadalo asi takto:

config.neon

common:
        parameters:
                database:
                        driver: mysql
                        hostname: localhost
                        database: ukoly
                        username: root
                        password:
			lazy: true
			profiler: true

        php:
                date.timezone: Europe/Prague
                # session.save_path: "%tempDir%/sessions"
                # zlib.output_compression: yes

        nette:
                session:
                        autoStart: smart

        services:
                # authenticator: Authenticator( @users )

        factories:
                tasks: Tasks
                users: Users
                tasklists: Tasklists

production < common:
development < common:

bootstrap.php

<?php

use Nette\Application\Routers\Route;

// Load Nette Framework
require LIBS_DIR . '/Nette/loader.php';

// Configure application
$configurator = new Nette\Config\Configurator;

// Enable Nette Debugger for error visualisation & logging
//$configurator->setProductionMode($configurator::AUTO);
$configurator->enableDebugger(__DIR__ . '/../log');

// Enable RobotLoader - this will load all classes automatically
$configurator->setTempDirectory(__DIR__ . '/../temp');
$configurator->createRobotLoader()
        ->addDirectory(APP_DIR)
        ->addDirectory(LIBS_DIR)
        ->register();

// Create Dependency Injection container from config.neon file
$configurator->addConfig(__DIR__ . '/config/config.neon');

$container = $configurator->createContainer();

// Setup router
$container->router[] = new Route('index.php', 'Homepage:default', Route::ONE_WAY);
$container->router[] = new Route('<presenter>/<action>[/<id>]', 'Homepage:default');

//připojení dibi
dibi::connect($container->parameters["database"]);

// Configure and run the application!
$container->application->run();
  1. Pokud dibi nepotřebuješ volat staticky, šel bych cestou DibiNetteExtension. Jak na to najdeš zde.
Taps
Člen | 169
+
0
-

ted to mám následovně
do bootstrap jsem doplnil

$configurator->onCompile[] = function ($configurator, $compiler) {
    $compiler->addExtension('dibi', new DibiNetteExtension);

config.neon

common:
    dibi:
        host: localhost
        username: root
        password:
        database: ukoly
        lazy: TRUE


        php:
                date.timezone: Europe/Prague
                # session.save_path: "%tempDir%/sessions"
                # zlib.output_compression: yes
    services:
        connection:
            class: DibiConnection
            factory: dibi::connect(%database%)
            run: TRUE


production < common:
development < common:

HomepagePresenter.php

<?php

/**
 * Presenter pro úvodní stránku. Obsahuje seznam úkolů, které jsou uživateli přiřazeny.
 */

class HomepagePresenter extends Nette\Object
{
    /** @var DibiConnection */
    private $db;

    protected function startup()
    {
        parent::startup();

        // vytvoří instanci služby a uloží do vlastnosti presenteru
        $this->db = $this->context->dibi->connection;
    }

    public function renderDefault()
    {
        $this->template->tasks= $this->db->query('SELECT * FROM ukoly');
        // ...
    }

    // ...
}

a zobrazuje se mi chyba
Service ‚connection‘: Missing item ‚database‘

Editoval Taps (18. 3. 2012 11:32)

Michal Vyšinský
Člen | 608
+
0
-

V config.neon máš parametr s názvem „dibi“ a v service „connection“ používáš „database“ buď přejmenuj jedno, nebo druhé :)

Taps
Člen | 169
+
0
-

upravil jsem to

common:
    database:

        host: localhost
        username: root
        password:
        database: ukoly
        lazy: TRUE


        php:
                date.timezone: Europe/Prague
                # session.save_path: "%tempDir%/sessions"
                # zlib.output_compression: yes
    services:
        connection:
            class: DibiConnection
            factory: dibi::connect(%database%)
            run: TRUE
production < common:
development < common:

a ted je chyba taková
Found sections ‚database‘ in configuration, but corresponding extensions are missing

mochja
Člen | 20
+
0
-
common:
	parameters:
		database:
			host: localhost
			username: root
			password:
			database: ukoly
			lazy: TRUE

	php:
		date.timezone: Europe/Prague
		# session.save_path: "%tempDir%/sessions"
		# zlib.output_compression: yes

	services:
		connection:
 		class: DibiConnection
		factory: dibi::connect(%database%)
		run: TRUE

production < common:

development < common:

https://doc.nette.org/cs/database#…

Editoval mochja (18. 3. 2012 12:04)

Taps
Člen | 169
+
0
-

ted se pro změnu vypisuje tato chyba
Cannot load presenter ‚Homepage‘, class ‚HomepagePresenter‘ is not Nette\Application\IPresenter implementor.

Michal Vyšinský
Člen | 608
+
0
-

Presenter musí samozřejmně dědit od \Nette\Application\UI\Presenter – ta chyba ti to sama říká. Asi by sis měl projít základy.

Edit: Nebo od BasePresenter, jestli jej máš udělaný.

Editoval CherryBoss (18. 3. 2012 12:50)

Taps
Člen | 169
+
0
-

Díky, jak říkám s Nette začínám a dibi se snažím nastavovat dle postupů, které najdu na webu nette nebo v diskusi. Bohužel s vyřešením jedné chyby se zobrazí zase jiná.
Ted se mi zobrazuje
Access denied for user ‚www-data‘@'localhost' (using password: NO), což nechápu, když udaje v config.neon jsou správně nastaveny.

Michal Vyšinský
Člen | 608
+
0
-

Divné, Dibi nedostává parametry, které jsou nastaveny. Zkus do bootstrap.php dát před $application->run() toto:

dump($container->parameters["database"]);

A podívej se, jestli to souhlasí s údaji v konfigu. To by ale asi mělo – tam chyba nebude.

Jinak – to dibi se snažíš použít jako NetteDibiExtension? Jestli jo tak jsi asi procházel toto (jak již psal @etch výše.

Jestli-že ano, tak se mi zdá, že mícháš hodně věcí dohromady – postup je následující:
V config.neon má být jen toto (co se db týče):

common:
    dibi:
        host: localhost
        username: root
        password: ***
        database: foo
        lazy: TRUE

Takže to předtím asi bylo dobře.

V bootstrap.php přidat extension (to asi už máš):

$configurator->onCompile[] = function ($configurator, $compiler) {
    $compiler->addExtension('dibi', new DibiNetteExtension);
};

A pak v config.neon do services můžeš udělat alias na dibi.connection takto:

database: @dibi.connection

Zkus to upravit na toto, kdyby ti to nejelo tak sem dej znovu kód aktuálních souborů: config.neon, bootstrap.php a HomePagePresenter.php

Editoval CherryBoss (18. 3. 2012 13:18)

Taps
Člen | 169
+
0
-

Díky moc, funguje

Editoval Taps (18. 3. 2012 16:55)

vichpetr
Člen | 11
+
0
-

Ahoj, mám stejný problém, jako popsaný na začátku .. Připojení k dibi mám stějně jako je to tu popsané a na localhostu mi to funguje, ale když aplikaci nahraju na ostrý web (hosting u pipni.cz), tak se zobrazí tato chyba – „Compile Error – Cannot redeclare class SystemContainer“. Můžete mi prosím poradit co s tím? Díky

P.S.: stejnou aplikaci jsem zkoušel ještě na další hostingu (banan.cz) a tam taky funguje …

jiri.pudil
Nette Blogger | 1032
+
0
-

V první řadě zkus smazat cache.

vichpetr
Člen | 11
+
0
-

to jsem zkoušel, vyzkoušel jsem vše co je tu psané …