Problem s konfiguraci po aktualizaci Nette
- MW
- Člen | 615
Zdravim a prosim o radu.
Po delsi dobe jsem se rozhodl, ze zkusim prejit na novejsi verzi Nette. Ale zmen bylo trochu vice. Zkousim to na cca rok starem projektu a hned me to hazi chybu na RobotLoaderu:
Service of type Nette\Loaders\RobotLoader not found
Vim, ze se udala rada zmen s enviromnentem a configem. Prolez jsem forum, ale nejak se me nedari najit spravnou cestu, aby to nerozvrtal vic, nez je treba.
Prosim o pomoc a radu, jak na to…
Radeji prikladam soucasny stav..
bootstrap:
//namespace IkonisModule;
use Nette\Diagnostics\Debugger, Nette\Environment, Nette\Application\Routers\SimpleRouter,
Nette\Application\Routers\Route, Nette\Forms\Container;
// Load Nette Framework
require LIBS_DIR . '/Nette/loader.php';
// Enable Nette\Debug for better exception and error visualisation
Debugger::$strictMode = TRUE;
Debugger::enable('127.0.0.1');
// Load configuration from config.neon file
Environment::loadConfig();
// Enable RobotLoader - this allows load all classes automatically
Environment::getRobotLoader()->register();
// Get the front controller
$application = Environment::getApplication();
//Zachytávání chyb
//$application->catchExceptions = TRUE;
//$application->errorPresenter = 'Front:Error';
// Datepicker +
Container::extensionMethod('addDatePicker', function (Container $container, $name, $label = NULL) {
return $container[$name] = new JanTvrdik\Components\DatePicker($label);
});
Container::extensionMethod('addDependentSelectBox', 'DependentSelectBox\DependentSelectBox::formAddDependentSelectBox');
Container::extensionMethod('addTextCaptcha', array('\TextCaptcha\TextCaptcha', 'addTextCaptcha'));
$application->onStartup[] = function(){
IkonisModule\BaseModel::init(Environment::getConfig()->database);
};
// Setup application routes
$router = $application->getRouter();
//dibi::connect(Environment::getConfig('database'));
//$router[] = new Route('sitemap[!.xml]', 'Front:Sitemap:default');
//$router[] = new Route('[!<lang=cs>/]admin/log/<action=>', 'Admin:Sign:in');
//$router[] = new Route('[!<lang=cs>/]admin[!/new]', 'Admin:Pages:default');
//$router[] = new Route('[!<lang=cs>/]admin/<slug>/<action=>', 'Admin:Pages:edit');
//$router[] = new Route('<slug [a-z0-9-]+>', 'Front:Page:default');
//$router[] = new Route('[index.php]', 'Front:');
$router[] = new Route('[index.php]', 'Ikonis:Pages:');
$router[] = new Route('<presenter>');
$router[] = new Route('<presenter>/<action>');
// Run the application!
$application->run();/--php
config
#
# 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:
date.timezone: Europe/Prague
# zlib.output_compression: yes
# default_charset: "UTF-8"
database:
dsn: 'mysql:host=localhost;dbname=ikonis'
user: xxx
password: 'xxx'
services:
authenticator:
class: \IkonisModule\MyAuth
authorizator:
class: \IkonisModule\Acl
production < common:
development < common:
- MW
- Člen | 615
Asi se tomu nevyhnu. Jsou reseny nejake veci v Nette\Database a nechce se me menit jen cast .. nebo uvazuju blbe?
Poradte prosim, jak v tuto chvili predelat ten bootstrap a config, ostatni u snad dam podle ladenky.
Ted jsem cetl v dokumentaci, ze to lze prakticky vsechno delat i jen pres config..
Snas se chytim…
Diky !
- MW
- Člen | 615
Tak nejak postupuju.. nevim ted, jak upravit toto:
Mam ted v configu toto:
services:
...
database:
class: Nette\Database\Connection
arguments: ['mysql:host=dev.host.cz;dbname=ikonis', 'xxx', 'xxx']
drive jsem mel v bootstrapu toto:
$application->onStartup[] = function(){
IkonisModule\BaseModel::init(Environment::getConfig()->database);
};
a v onom BaseModelu:
static public $database;
static function init($database) {
self::$database = new \Nette\Database\Connection(
$database->dsn, $database->user, $database->password);
}
a pak jsem pristupoval v modelech k datum pres
self::$database->table('table')->.....
Zamotal jsem se v tom.. nevim jak dal…
Moc diky
Editoval MW (6. 9. 2012 13:07)
- mkoubik
- Člen | 728
Tu metodu init
smaž z BaseModel
u i z bootstrapu
a místo toho si předej Connection
do BaseModelu
konstruktorem:
class BaseModel extends \Nette\Object {
protected $database;
public function __construct(\Nette\Database\Connection $database) {
$this->database = $database;
}
}
pak v modelech nahraď self::$connection->...
za
$this->connection->
.
Nakonec si všechny modely zadefinuj jako služby v
config.neon
:
services:
fooModel: FooModel
a předávej si je do presenterů pomocí inject*()
metod.
EDIT: $database
změněno na protected
.
Editoval mkoubik (6. 9. 2012 17:27)
- MW
- Člen | 615
Prokousavam se a vypada to, ze to jde…
Delam to dle tveho navodu…
V modelech jdu k datum pres
$this->database //(musi byt ale public v baseModelu)
a k modelum v presenterech lezu zatim pres
$this->context->xxxModel
Jen nevim, jak se dostat k $database v authenticatoru:
class MyAuth extends \Nette\Object implements \Nette\Security\IAuthenticator
{
function authenticate(array $credentials)
{
list($username, $password) = $credentials;
$row = BaseModel::$database->table('users')->where('email', $username)->fetch();
if (!$row) {
throw new \Nette\Security\AuthenticationException('Uzivatel neexistuje');
}
if (md5($password) !== $row->password) {
throw new \Nette\Security\AuthenticationException('Spatne heslo');
}
$roles = array($row->role);
return new \Nette\Security\Identity($row->id, $roles, array('name' => $row->name));
}
}
Dekuji !
- mkoubik
- Člen | 728
MW napsal(a):
$this->database //(musi byt ale public v baseModelu)
Nemusí, stačí protected. (opraveno v původním příspěvku)
Jen nevim, jak se dostat k $database v authenticatoru:
Buď si authenticator taky poďeď od BaseModelu, nebo (pokud máš v BaseModelu další věci který v authenticatoru nepotřebuješ) si tam connection předej přes konstruktor stejně jako do BaseModelu.