pripojenie k dibi (Class ‚DibiNetteExtension‘ not found)
- lime
- Člen | 55
Učím sa pracovať s dibi a hádže mi to výnimku uvedenú v názve topicu, môj 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:
php:
date.timezone: Europe/Prague
# zlib.output_compression: yes
nette:
application:
errorPresenter: Error
database:
dsn: 'mysql:host=localhost;dbname=test'
user:
password:
session:
expiration: 14 days
services:
authenticator: Authenticator
routerFactory: RouterFactory
router: @routerFactory::createRouter
posts:
class: \Posts(@dibi.connection)
factories:
production < common:
development < common:
dibi:
host: localhost
username: root
password:
database: myPageDB
lazy: TRUE
bootstrap.php:
<?php
// Load Nette Framework or autoloader generated by Composer
require __DIR__ . '/../libs/autoload.php';
$configurator = new Nette\Config\Configurator;
// Enable Nette Debugger for error visualisation & logging
//$configurator->setDebugMode(TRUE);
$configurator->enableDebugger(__DIR__ . '/../log');
// Specify folder for cache
$configurator->setTempDirectory(__DIR__ . '/../temp');
// Enable RobotLoader - this will load all classes automatically
$configurator->createRobotLoader()
->addDirectory(__DIR__)
->addDirectory(__DIR__ . '/../libs')
->register();
// Create Dependency Injection container from config.neon file
$configurator->addConfig(__DIR__ . '/config/config.neon');
$configurator->addConfig(__DIR__ . '/config/config.local.neon', $configurator::NONE); // none section
$configurator->onCompile[] = function ($configurator, $compiler) {
$compiler->addExtension('dibi', new DibiNetteExtension);
};
$container = $configurator->createContainer();
return $container;
thx
- lime
- Člen | 55
ďakujem one-two – presne tam bol problém, a mám tu ďalší :/ nechcem vytvárať novú tému tak to napíšem sem, hádže mi to výnimku ‚Dibi is not connected to database‘. Zrejme bude chyba v mojom modely tabuľky ‚posts‘, vie niekto čo mám zle?
<?php
class Posts extends \Nette\Object {
private $connection;
public function __construct (\DibiConnection $connection) {
$this->connection = $connection;
}
public static function fetchAll() {
return dibi::fetchAll('SELECT * FROM [posts] ORDER BY [id]', dibi::DESC);
}
}
- Šaman
- Člen | 2666
Kombinuješ statický (postaru) a dynamický (dnes doporučovaný) přístup
k dibi. To dibi::
nahraď $connection->
. Nebo tu
proměnnou $connection
přejmenuj na $dibi
a pak
místo dvojteček používej šipku. Rozdíl bude v tom, že
$dibi->
můžeš použít jen, pokud si nějak získáš
instanci DibiConnection, zatímco statické volání šlo zapsat kamkoliv
(takže to vede ke špagety kódu).
- lime
- Člen | 55
Dibi som „nainštaloval“ dnes a nikde som nenašiel normálny tutoriál tak preto som to takto pokombinoval :D a teda ako by to malo byť správne? Toto mi hádže syntax error v netbeanse
<?php
class Posts extends \Nette\Object {
private $dibi;
public function __construct (\DibiConnection $dibi) {
$this->dibi = $dibi;
}
public static function fetchAll() {
return $dibi->fetchAll('SELECT * FROM [posts] ORDER BY [id]', dibi->DESC);
}
}
teda keď zadám return $dibi→ tak mi netbeans nič „neponúkne“ takže to nepozná
Editoval lime (12. 12. 2013 21:46)
- Pavel Macháň
- Člen | 282
lime napsal(a):
Dibi som „nainštaloval“ dnes a nikde som nenašiel normálny tutoriál tak preto som to takto pokombinoval :D a teda ako by to malo byť správne? Toto mi hádže syntax error v netbeanse
<?php class Posts extends \Nette\Object { private $dibi; public function __construct (\DibiConnection $dibi) { $this->dibi = $dibi; } public static function fetchAll() { return $dibi->fetchAll('SELECT * FROM [posts] ORDER BY [id]', dibi->DESC); } }
teda keď zadám return $dibi→ tak mi netbeans nič „neponúkne“ takže to nepozná
class Posts extends \Nette\Object {
/** @var \DibiConnection */
private $dibi;
public function __construct(\DibiConnection $dibi) {
$this->dibi = $dibi;
}
public function fetchAll() {
return $this->dibi->query('SELECT * FROM [posts] ORDER BY [id]')->fetchAll();
}
// nebo fluent zapis
public function fetchAllByFluent() {
return $this->dibi->select('*')->from('posts')->orderBy('id')->fetchAll();
}
}
Editoval EIFEL (12. 12. 2013 21:57)
- Šaman
- Člen | 2666
Hmm.. možná nebyl nejlepší nápad radit ti, aby sis připojení pojmenoval $dibi, protože teď tě to bude svádět skutečně jen nahrazovat čtyřtečku šipkou. Těch tozdílů je víc, některé nesouvisí s Dibi, ale OOP, jiné vycházejí z rodílného API statických a dynamických funkcí:
Viz kód od EIFELa
- napovídání pořeší ta anotace nad definováním třídní proměnné
- doporučuji použít
'use DibiConnection;'
a pak nemusíš psát třídy s lomítkem na začátku - všude mimo konstruktor nepřistupuješ k lokální proměnné
$dibi
, ale k property$this->dibi
- ty statické funkce jsou často aliasy (zkratky) pro volání dynamických funkcí (viz případ s dibi::fetchAll()). Požívej metody třídy DibiConnection, nebo DibiFluent (k fluent zápisu se dostaneš tak, že na connection zavoláš jednu z metod, která vrací DibiFluent – typicky select, insert, delete, update)
Editoval Šaman (12. 12. 2013 22:19)
- David Matějka
- Moderator | 6445
Posts si zaregistruj jako sluzbu, kterou injectnes do presenteru:
do config.neon do sekce services pridej:
posts: Posts
(nezapomen na spravne namespace a odsazeni v neonu – musi to byt o jednu
uroven zanorenejsi nez „services“)
v tom neonu je to ve fromatu nazevSluzby: Trida\Vcetne\Namespace
.. nazev sluzby ani neni tak podstatny a muze byt libovolny, v nove verzi se
ani nemusi uvadet..
do presenteru dostanes pak tu sluzbu treba takhle:
class SomePresenter extends BasePresenter
{
/** @var Posts */
protected $posts;
public function injectPosts(Posts $posts)
{
$this->posts = $posts;
}
}
nette si projde vsechny metody zacinajici na „inject“ a podle typehintu tam posle sluzby (zde si zase dej pozor na namespace)
- lime
- Člen | 55
Tak som to nejako spravil, ale hádže mi to výnimku ‚Call to a member
function fetchAll() on a non-object‘, tu sú zdrojáky:
config.neon:
common:
parameters:
php:
date.timezone: Europe/Prague
# zlib.output_compression: yes
nette:
application:
errorPresenter: Error
database:
dsn: 'mysql:host=localhost;dbname=myPageDB'
user:
password:
session:
expiration: 14 days
services:
authenticator: Authenticator
routerFactory: RouterFactory
router: @routerFactory::createRouter
posts: Posts
factories:
production < common:
development < common:
dibi:
host: localhost
username: root
password:
database: myPageDB
lazy: TRUE
Posts.php:
<?php
class Posts extends \Nette\Object {
private $connection;
public function __construct (\DibiConnection $connection) {
$this->connection = $connection;
}
public function fetchAll() {
return $this->connection->query('SELECT * FROM [posts] ORDER BY [id] DESC')->fetchAll();
}
}
HomepagePresenter.php
<?php
class HomepagePresenter extends BasePresenter {
protected $posts;
public function inejctPosts(Posts $posts) {
$this->posts = $posts;
}
public function renderDefault() {
$this->template->posts = $this->posts->fetchAll();
}
}
Editoval lime (17. 12. 2013 10:41)
- Pavel Macháň
- Člen | 282
lime napsal(a):
<?php class HomepagePresenter extends BasePresenter { protected $posts; public function inejctPosts(Posts $posts) { $this->posts = $posts; } public function renderDefault() { $this->template->posts = $this->posts->fetchAll(); } }
Pokud třída nemá nastavený namespace musíš uvádět \ a HLAVNĚ máš blbě inject metodu máš tam inejctPosts místo injectPosts
public function injectPosts(\Posts $posts) {
$this->posts = $posts;
}
Editoval EIFEL (17. 12. 2013 11:20)
- lime
- Člen | 55
diky, stačilo to inJEct opraviť a ide to. Nechcem vytvárať nové vlákno tak to napíšem sem: registráciu som si už „prerobil“ na dibi, ale mám problém pri prihlasovaní v Autentikátori, výnimka: „Call to a member function login() on a non-object“ pri tomto kóde:
$row = $this->users->login($username);
kam to mám teda priradiť?
- David Matějka
- Moderator | 6445
tohle volas v authenticatoru? no v clenske promenne „users“ nemas objekt.. pokud to ma byt nejaka tvoje modelova trida, tak si ji vyzadej v konstruktoru:
class Authenticator implements Nette\Security\IAuthenticator
{
protected $users;
public function __contruct(Users $users)
{
$this->users = $users;
}
}