Přihlašování uživatelů za pomoci dibi layeru

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

Nette 2 php 5.3

Zdravím, jsem začátečník a mám problém hlavně se zprovozněním dibi:

Laděnka mi vyhazuje tuhle chybu: InvalidArgumentException Configuration must be array, string or object.

KÓD Authenticator

class Authenticator extends Object implements IAuthenticator

{

 /** @var \DibiConnection */

    private $database;



    public function __construct(DibiConnection $database)
    {
        $this->database = $database;
    }




    public function authenticate(array $credentials)
    {
        list($username, $password) = $credentials;

        $row = dibi::select('*')->from('uzivatel')->where('Login=%s', $username)->fetch();
        if (!$row) {
            throw new NS\AuthenticationException("Uživatel '$username' nebyl nalezen.", self::IDENTITY_NOT_FOUND);
        }

        if (!$row) {
            throw new AuthenticationException('Uživatel nenalezen.', self::IDENTITY_NOT_FOUND);
        }


        if ($row->heslo !== md5($password)) {
            throw new AuthenticationException('Nesprávné heslo.', self::INVALID_CREDENTIAL);
        }

        return new Identity($row->login, NULL, $row->toArray());

KOD boostramp.php

<?php

/**
 * My Application bootstrap file.
 */



// Load Nette Framework or autoloader generated by Composer
require LIBS_DIR . '/autoload.php';


// Configure application
$configurator = new Configurator;

// Enable Nette Debugger for error visualisation & logging
//$configurator->setDebugMode(Configurator::AUTO);
$configurator->enableDebugger(dirname(__FILE__) . '/../log');

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

// Create Dependency Injection container from config.neon file
$configurator->addConfig(dirname(__FILE__) . '/config/config.neon');
$container = $configurator->createContainer();

// Setup router
if (function_exists('apache_get_modules') && in_array('mod_rewrite', apache_get_modules())) {
    $container->router[] = new Route('index.php', 'Head:default', Route::ONE_WAY);
    $container->router[] = new Route('<presenter>/<action>[/<id>]', 'Head:default');

} else {
    $container->router = new SimpleRouter('Head:default');
}

$configurator->onCompile[] = function ($configurator, $compiler) {    // pridal jsem toto
    $compiler->addExtension('dibi', new DibiNetteExtension);
};
dibi::connect(Environment::getConfig('db'));
// Run the application!
$container->application->run();

KOD 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

		common:
				db.server=	localhost
				db.database=	portalpramos
				db.username=	root
				db.password=
				db.driver=	mysqli
				db.charset=	utf8
				db.lazy=	TRUE

		session:
			expiration: 14 days


	services:
		authenticator: Authenticator(@connection)
		connection:
					class: DibiConnection($database)



	factories:


production < common:

development < common:

Díky za pomoc.

Majkl578
Moderator | 1364
+
0
-

Vyhoď a) dibi::connect z bootstrapu, nemá to tam co dělat; b) definici služby connection z configu.
Jelikož registruješ DI extension, budeš mít dostupnou instanci DibiConnection v rámci DI – buď se ti bude autowirovat (v případě authenticatoru automaticky) anebo ji můžeš ručně získat skrze $container->dibi->connection.

Nevinho
Člen | 77
+
0
-

ServiceCreationException Service ‚authenticator‘: Reference to missing service ‚connection‘.

Tohle mi to hlásí, když oddělám tu definici z bootstrapu a z configu

Už se s tím trápím asi 2 dny a nevím co s tím :-(.

Bez dibi mi to jelo všechno v cajku, ale budu dibi potřebovat pozdějí tak to potřebuju nějak zprovoznit :-(

Majkl578
Moderator | 1364
+
0
-

To bude tím, že služba s názvem connection neexistuje. Existují dvě řešení předání služby autenticatoru:

1. implicitní – necháš Nette předat argument do konstruktoru automaticky (autowiring), tzn. z configu smažeš @connection, zůstane tedy pouze:

authenticator: Authenticator

2. explicitní – řekneš Nette, jakou službu předat jako argument; tohle vpodstatě máš teď, akorát musíš opravit název služby – jelikož DibiNetteExtension název služby prefixuje názvem DI rozšíření, bude název @dibi.connection, tzn. takto:

authenticator: Authenticator(@dibi.connection)

První řešení je příjemnější, ale magičtější, druhé je více konvenční z hlediska čitelnosti.

Obojí by mělo být popsané v dokumentaci.


Příště prosím obal kód značkami pro blok PHP kódu, stačí kliknout na tuhle ikonku: 

Nevinho
Člen | 77
+
0
-

Hele pořád mi to hlásí stejnou chybu :-(

ServiceCreationException Service ‚authenticator‘: Reference to missing service ‚dibi.connection‘

a zvolil jsem tu druhou metodu jak si psal víše v textu..

Tak nevím kde může být chyba

Majkl578
Moderator | 1364
+
0
-

Ještě jsem si všiml, že budeš muset upravit config, abys měl údaje pro připojení k databázi v části dibi, měl by tedy vypadat takto:

common:
    parameters:

    php:
        date.timezone: Europe/Prague
        # zlib.output_compression: yes

    nette:
        application:
            errorPresenter: Error

        common:

        session:
            expiration: 14 days

    dibi:
        server: localhost
        database: portalpramos
        username: root
        password:
        driver: mysqli
        charset: utf8
        lazy: TRUE

    services:
        authenticator: Authenticator(@dibi.connection)
        # alternativne pouze:
        #authenticator: Authenticator

    factories:

production < common:

development < common:

Zkus, nezapomeň promazat cache.