Nastavení Nette pro připojení DIBI
- Taps
- Člen | 169
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
- Etch
- Člen | 403
Na první pohled mi přijde, že tam mícháš X věcí dohromady.
- config.ini bych úplně vyhodil.
- 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();
- Pokud dibi nepotřebuješ volat staticky, šel bych cestou DibiNetteExtension. Jak na to najdeš zde.
- Taps
- Člen | 169
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
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
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
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)
- Michal Vyšinský
- Člen | 608
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
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
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)
- vichpetr
- Člen | 11
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 …