Problem s konfiguraci po aktualizaci Nette

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

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:
Jan Tvrdík
Nette guru | 2595
+
0
-

A chceš Environment používat nadále nebo se ho chceš zbavit?

MW
Člen | 615
+
0
-

Co doporucujes ? Z toho jsem jsem vycetl, bych rekl, ze je lepsi se ho zbavit.. otazka je, co vsechno bych musel jeste kde menit…

Moc dekuju ..

MW
Člen | 615
+
0
-

Ted jsem nekde prispevek od Davida, ze je Environment takrka pryc :-) Tedy nemam na vyber.
Asi by melo stacil poladit jen bootstrap a config, ze?

22
Člen | 1478
+
0
-

Určitě ne, předělávat aplikaci běžíci na Environmentu pod DI až v případě nejvyšší nutnosti. Pokud není důvod pro upgrade Nette, tak bych nechal běžet na starší verzi. Jiank te celou dobu povede Laděnka, kdyby jsi musel upgradovat. :-)

Editoval 22 (6. 9. 2012 11:15)

MW
Člen | 615
+
0
-

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 !

22
Člen | 1478
+
0
-

Podivej se na sandbox v distribuci a pak na QuickStart a zjistíš sám, co je jinak :-)

MW
Člen | 615
+
0
-

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

Tu metodu init smaž z BaseModelu 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
+
0
-

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

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.

MW
Člen | 615
+
0
-

Funguje, diky !