nette-acl problém v Nette 2.1.1

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

Ahoj,

mám staženou poslední aktualizaci Nette-Acl od Tomáše Votruby : https://github.com/…ll/1/commits

po rozběhnutí se mi zobrazila hláška:

Nette\Database\Connection::table() is deprecated; use Nette\Database\Context::table() instead

pochopil jsem jí tak, že mám místo třídy Connection používat třídu Context

Změnil jsem tedy konstuktor Autentifikátoru ze stavu:

/**
	 * @param Nette\Database\Connection
	 */
    public function __construct(Nette\Database\Connection $database)
    {
        $this->database = $database;
    }

na

/**
	 * @param Nette\Database\Connection
	 */
    public function __construct(Nette\Database\Context $database)
    {
        $this->database = $database;
    }

a také v neonu:

z

	services:
		database:
			class: Nette\Database\Connection
			arguments: [
				'%database.driver%:host=%database.host%;dbname=%database.dbname%',
				%database.user%,
				%database.password%
			]

		authenticator: AclProj\Security\Authenticator

		authorizator:
			class: Nette\Security\Permission
			setup:
				- addRole('guest')
				- addRole('editor')
				- addRole('admin')
				- addResource('Admin:Default')
				- addResource('Admin:Page')
				- allow('editor', 'Admin:Default')
				- allow('admin')

na

	services:
		database:
			class: Nette\Database\Context
			arguments: [
				'%database.driver%:host=%database.host%;dbname=%database.dbname%',
				%database.user%,
				%database.password%
			]

		authenticator: AclProj\Security\Authenticator

		authorizator:
			class: Nette\Security\Permission
			setup:
				- addRole('guest')
				- addRole('editor')
				- addRole('admin')
				- addResource('Admin:Default')
				- addResource('Admin:Page')
				- allow('editor', 'Admin:Default')
				- allow('admin')

V tomto stavu mi laděnka hlásí:

Argument 1 passed to Nette\Database\Context::__construct() must be an instance of Nette\Database\Connection, string given, called in C:\wamp\www\nette-acl-master\temp\cache\_Nette.Configurator\_-c7945ac5b2060ad880adf72b991dbf3d.php on line 171 and defined

takže bude potřeba změnit argumenty volání třídy context v neonu..Ale nevím bohuže jak..Neporadil by jste mi někdo? :-)

enumag
Člen | 2118
+
0
-

Tu službu database vytváříš špatně. https://doc.nette.org/cs/configuring#…

JDC
Člen | 19
+
0
-

Teoreticky by postačilo ponechat class: Nette\Database\Connection v tom neonu. Ale takto jsem db spojení nikdy nevytvářel, kdo ví, jestli to tak jde. Ale pokud ti to na staré verzi nette tak fungovalo, tak to asi šlo. Mám ale takové tušení, že v Nette 2.1 už to tak asi touto cestou nepůjde.

Nette friendly řešení je službu database vytvářet nikoli pod services, ale pod nette, jak se píše v dokumentaci:

nette:
    database:
        default:
            dsn: "mysql:host=<server>;dbname=<db>"
            user: <user>
            password: <pass>
            options:
                lazy: true # lazy loading. Lze vypnout - false

Pak už stačí jen přes konstruktor do modelů vecpat Nette\Database\Context a mělo by to fungovat.

enumag
Člen | 2118
+
0
-

Ono to hlavně bylo i ve 2.0 špatně protože databázová vrstva v tu chvíli nepoužívala cache a aplikace kladla na databázi zbytečné dotazy.

esorimer
Člen | 114
+
0
-

Zdravím, přidám se k dotazu. Aktualizoval jsem na Nette 2.1.1. V configu mám

common:
	nette:
		database:
			default:
				....
			programy:
				dsn: sqlite:%dataDir%programy/programy.db3
	service:
		fooRepository: \Model\FooRepository
		prgRepository:	\Model\PrgRepository( @nette.database.programy , %dalsiArgument% )

fooRepository má v konstruktoru Context a ten taky dostane, prgRepository má jako první argument konstruktoru taky Context, ale dostane Connection :(

Zatím to řeším tak, že jsem změnil argument konstruktoru prgRepository na Connection a Context si vytvářím až v něm, ale to se mi moc nelíbí … Dal by se nějak předat rovnou Context?

Mysteria
Člen | 797
+
0
-

@esorimer: Předávej jako parametr @nette.database.programy.context nebo ho nepředávej vůbec:

class SomeRepository {
    public function __construct($some, \Nette\Database\Context $database) {
		$this->database = $database;
		$this->some = $some;
    }
}

service:
 - SomeRepository('some')

V tomhle případě se chybějící parametry pokusí najít podle hintů.

Editoval Mysteria (10. 3. 2014 10:05)

esorimer
Člen | 114
+
0
-

Mysteria napsal(a):

@esorimer: Předávej jako parametr @nette.database.programy.context

Díky! Tohle pomohlo. Dá se o tom někde dočíst v dokumentaci? Abych si to mohl pořádně nastudovat :-)

(PS: Ten druhý způsob nejde, protože mám víc databází …)