Přihlašování uživatelů za pomoci dibi layeru
- Nevinho
- Člen | 77
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
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
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
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:
- Majkl578
- Moderator | 1364
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.