pripojenie k dibi (Class ‚DibiNetteExtension‘ not found)

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

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

one-two
Člen | 80
+
0
-

Buď ti tu třídu nenajde robotloader (nemáš pravděpodobně dibi v libs) nebo si vůbec nestáhl dibi přes composer

lime
Člen | 55
+
0
-

v projekte v zložke /libs mám zložku /dibi, ktorá obsahuje zložky bridges,drivers,libs a dibi.php

leninzprahy
Člen | 150
+
0
-

Zkus smazat cache, (obsah adresáře …/temp/cache).

one-two
Člen | 80
+
0
-

podle toho co je tady možná voláš špatnou class

lime
Člen | 55
+
0
-

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

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

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)

David Matějka
Moderator | 6445
+
0
-

$this->dibi->fetchAll()

lime
Člen | 55
+
0
-

Hádže mi to výnimku ‚Using $this when not in object context‘ takže metoda fetchAll() asi nemôže byť statická, ako sa potom dostanem v presenteri k tejto funkcii?

Pavel Macháň
Člen | 282
+
0
-

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

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

  1. napovídání pořeší ta anotace nad definováním třídní proměnné
  2. doporučuji použít 'use DibiConnection;' a pak nemusíš psát třídy s lomítkem na začátku
  3. všude mimo konstruktor nepřistupuješ k lokální proměnné $dibi, ale k property $this->dibi
  4. 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)

lime
Člen | 55
+
0
-

Tomuto som už pochopil, iba sa chcem spýtať ako sa dostanem k tej funkcii (napr. tá fetchAll() od EIFELA) v presenteri, musím si v ňom vytvoriť objekt modelu Posts? ako to urobiť?

David Matějka
Moderator | 6445
+
0
-

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

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

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

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

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;
	}

}