Konfigurácia Doctrine 2 funkcií v Nette 2

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

Zdravím,
našiel pre funkcie IF pre Doctrine QueryBuilder a teraz by som ju potreboval niekde „zaregistrovať“.

http://stackoverflow.com/…at-or-anothe

Skúsil som to teda takto:

doctrine:
		connection: %database%

		console: true

		orm:
			dql:
				string_functions:
					IF: \vendor\doctrine\orm\lib\Doctrine\ORM\Query\AST\Functions\IfFunction

Stále ale dostanem chybu:

Doctrine\ORM\Query\QueryException
[Syntax Error] line 0, col 10: Error: Expected known function, got ‚IF‘

Vopred ďakujem za pomoc

EDIT: Odsadenie

Editoval orech (6. 8. 2013 12:33)

Patrik Votoček
Člen | 2221
+
0
-

rekl bych ze ti pred tim IF chyby odsazeni

orech
Člen | 40
+
0
-

Upravil som to tak, ako to je v config.neon. Neviem prečo to tam bolo pod sebou (nevenoval som tomu pozornosť :)).

Každopádne to s tým odsadením nejde. Podarilo sa mi to spraviť tak, že som miesto IF použil CASE WHEN. Ten Doctrine poznal.

Ale aj tak by ma zaujímalo, ako pridať funkcie do Doctrine v Nette. Raz som to už riešil pre DATE_FORMAT, no to som opäť vyriešil inak, cez „raw“ SQL.

Filip Procházka
Moderator | 4668
+
0
-

Měl by jsi tam psát pouze namespace, nikoliv složky.

A v samotném Nette asi nijak, ale kdybys použil kdyby/doctrine, tak třeba IfElse, bys po nainstalování beberlei/DoctrineExtensions registroval takto

doctrine:
	dql:
		string:
			IfElse: DoctrineExtensions\Query\Mysql\IfElse
orech
Člen | 40
+
0
-

Používam, resp. sa snažím použiť :), rovnaký balíček rozšírení. Skúsil som to cez config.neon, moc to nešlo. Dopátral som sa k zápisu:

doctrine:
	orm:
		dql:
			string:
				IfElse: DoctrineExtensions\Query\Mysql\IfElse

Ani s ním som však nebol úspečný. Zavolal som ešte v bootstrap.php inicializáciu:

$classLoader = new \Doctrine\Common\ClassLoader('DoctrineExtensions', LIBS_DIR ."/DoctrineExtension/lib/DoctrineExtensions");
$classLoader->register();

Dotaz cez QueryBuilder, addSelect("IF ..."), mi stále vráti Error: Expected known function, got ‚IF‘

Filip Procházka
Moderator | 4668
+
0
-

Instaluješ to přes composer? Co vypíše $ composer show --installed? Ukaž tu query. Ten zápis v neonu máš blbě, je to přesně jak jsem napsal já :)

orech
Člen | 40
+
0
-

Neinštalujem. Len som to stiahol a nakopčil.

Skúsil som to pomocou composeru. Mám Xampp na Windowse, takže composer a tie extensions som pozliepal z nasledovných:

http://www.naeemrana.com/…-in-windows/

http://mabraham.de/…2-verwenden/

Keď som dal daný príkaz, teda trochu upravený pre Windows, a dostal som toto:

D:\xampp\htdocs\my-web\libs\beberlei>php D:\xampp\php\composer.phar show --installed
doctrine/annotations v1.1.2 Docblock Annotations Parser
doctrine/cache       v1.3.0 Caching library offering an object-oriented API for many cache backends
doctrine/collections v1.1   Collections Abstraction library
doctrine/common      v2.4.1 Common Library for Doctrine projects
doctrine/dbal        v2.4.1 Database Abstraction Layer
doctrine/inflector   v1.0   Common String Manipulations with regard to casing an d singular/plural rules.
doctrine/lexer       v1.0   Base library for a lexer that can be used in Top-Down, Recursive Descent Parsers.
doctrine/orm         v2.4.1 Object-Relational-Mapper for PHP
symfony/console      v2.3.7 Symfony Console Component

Ozaj netuším, či je to, o čo si žiadal. Ak nie, tak potom pardón, je to prvý raz, čo som sa stretol s composerom :)

Filip Procházka
Moderator | 4668
+
0
-

Aha, ale to máš pouze čistou doctrine, ta konfigurační sekce začne fungovat, až nainstaluješ i Kdyby/Doctrine

orech
Člen | 40
+
0
-

Stiahol som zip z Gitu. Rozbalil som do /libs/kdyby (/libs mám to namiesto /vendor). Nastavil som v composer.json (moja verzia Nette: Nette Framework 2.0.8):

"require": {
        "nette/nette": "~2.0",
        "kdyby/doctrine": "~0.10"
    }

Potom som zavolal v priečinku:

D:\xampp\htdocs\my-web\libs\kdyby>php D:\xampp\php\composer.phar require kdyby/doctrine

Opýtalo sa ma to na nejakú verziu, tak som zadal 0.1 (podľa (Pozn.: řada 0. je pro ~2.0@stable Nette, řada 1.* je pro ~2.1@dev Nette)*) a dostal som fail, že daná verzia neexistuje:

Please provide a version constraint for the kdyby/doctrine requirement: 0.1
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - The requested package kdyby/doctrine 0.1 could not be found.
  Problem 2
    - Installation request for kdyby/doctrine 1.0.x-dev -> satisfiable by kdyby/doctrine[1.0.x-dev].
    - kdyby/doctrine 1.0.x-dev requires kdyby/doctrine 0.1 -> no matching package found.

Potential causes:
 - A typo in the package name
 - The package is not available in a stable-enough version according to your minimum-stability setting
   see <https://groups.google.com/d/topic/composer-dev/_g3ASeIFlrc/discussion> for more details.

Read <http://getcomposer.org/doc/articles/troubleshooting.md> for further common problems.

Installation failed, reverting ./composer.json to its original content.

Skúsil som verziu 1.0:

Please provide a version constraint for the kdyby/doctrine requirement: 1
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - Installation request for kdyby/doctrine 1.0.x-dev -> satisfiable by kdyby/doctrine[1.0.x-dev].
    - Can only install one of: kdyby/doctrine[v1.0.0, 1.0.x-dev].
    - Installation request for kdyby/doctrine 1 -> satisfiable by kdyby/doctrine [v1.0.0].

Installation failed, reverting ./composer.json to its original content.

Zrejme mi niečo uchádza, no neviem čo :( (púšťam to z dobrého priečinka, alebo niečo treba ešte nastaviť…?)

Filip Procházka
Moderator | 4668
+
0
-

Sakra ty v tom máš guláš :) Takže popořadě…

  • nainstaluješ composer (to už máš)
  • nainstaluješ git
  • vlezeš do projektu a smažeš všechen bordel co sis udělal v libs/ nebo vendor/, včetně Nette, Doctrine, Kdyby, ..
  • V composer.json budeš mít tyto dvě závislosti
"require": {
	"nette/nette": "~2.0",
	"kdyby/doctrine": "~0.10"
}
  • spustíš composer update
D:\xampp\htdocs\my-web\libs\kdyby>php D:\xampp\php\composer.phar update

tím se zapne instalace, composer sám stáhne všechny závislosti, sám je rozbalí do libs/ nebo vendor/ a sám k nim vygeneruje autoloader.

  • do app/bootstrap.php přidáš
require_once __DIR__ . '/../libs/autoload.php';

tím načteš do aplikace autoloader co vygeneroval composer a už tam nemusíš mít řádek s require nette, protože i autoloading Nette řeší nyní Composer.

  • profit

Možná zvaž ještě návštěvu Nette Jabber místonosti, kde ti poradíme líp, takhle přes fórum s tvojí dvoudenní reakční dobou to není nic moc :)

orech
Člen | 40
+
0
-

No to teda mám :(

Composer aj Git mám (aj v env. premennej PATH). Neviem, aký bordel si myslel, keďže sa mi tam nič nenatiahlo :) Mám tam len štandard, čo bol v sandboxe. Každopádne, stiahol som čistý sandbox. Do zložky sandbox/libs/ som vytvoril zložku kdyby, kam som rozbalil všetko z https://github.com/kdyby/doctrine. Štruktúra prnscr

Upravil som súbor sandbox/libs/kdyby/composer.json, iba som zmenil pole/objekt "required" (riadok 18), nič iné som nemazal, ani neprepisoval.

	...
	"issues": "https://github.com/kdyby/doctrine/issues"
},
"require": {
	"nette/nette": "~2.0",
	"kdyby/doctrine": "~0.10"
},
"require-dev": {
	"nette/tester": "@dev",
	...

Pustil som composer cez cmd.exe:

D:\xampp\htdocs\sandbox\libs\kdyby>php D:\xampp\php\composer.phar update

A dostal som nasledovný error:

Loading composer repositories with package information
Updating dependencies (including require-dev)
Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - Conclusion: remove kdyby/doctrine 1.0.0
    - Can only install one of: kdyby/doctrine[v1.0.0, v0.10.0].
    - Can only install one of: kdyby/doctrine[v1.0.0, v0.10.1].
    - Can only install one of: kdyby/doctrine[v1.0.0, v0.10.2].
    - Can only install one of: kdyby/doctrine[v1.0.0, v0.10.3].
    - Installation request for kdyby/doctrine 1.0.0 -> satisfiable by kdyby/doctrine[1.0.0].
    - Installation request for kdyby/doctrine ~0.10 -> satisfiable by kdyby/doctrine[v0.10.0, v0.10.1, v0.10.2, v0.10.3].

Skúsil som to potom tak, že som premazal sandbox/libs/ úplne a nechal tam len súbory .htaccess a web.config a priečinok kdyby. Chyba ostala rovnaká.


Pokúsim sa odpisovať rýchlejšie, no toto riešim len keď sa mám chvíľu čas „hrať“ :) Vyslovene to nepotrebujem, no príde mi zaujímavé a hlavne užitočné a chcem to vedieť.

bazo
Člen | 620
+
0
-

nevytvaraj ziadne zlozky v libs, ani tam nic nekopiruj. od toho je composer, aby ti nainstaloval, co potrebujes.

zmaz vsetko co je v libs a este raz pusti composer update

orech
Člen | 40
+
0
-

Aha díky moc obom. Takže zmenil som len "require" hodnoty v composer.json v roote zložky sandbox. Do libs sa mi natiahli zložky nette, symphony, doctrine…je tam aj zložka kdyby.

EDIT:

Rovnako (iba zmenou „require“ v roote projektu) som nainštaloval DoctrineExtensions. (Návod: http://mabraham.de/…2-verwenden/)

Pridávam výpis:

D:\xampp\htdocs\vav-efektiv>php D:\xampp\php\composer.phar show --installed
beberlei/DoctrineExtensions v0.1
doctrine/annotations        v1.1.2  Docblock Annotations Parser
doctrine/cache              v1.3.0  Caching library offering an object-oriented API for many cache backends
doctrine/collections        v1.1    Collections Abstraction library
doctrine/common             v2.4.1  Common Library for Doctrine projects
doctrine/dbal               v2.4.1  Database Abstraction Layer
doctrine/inflector          v1.0    Common String Manipulations with regard to casing and singular/plural rules.
doctrine/lexer              v1.0    Base library for a lexer that can be used in Top-Down, Recursive Descent Parsers.
doctrine/orm                v2.4.1  Object-Relational-Mapper for PHP
kdyby/annotations           v1.0.1  Doctrine Annotations integration into Nette Framework
kdyby/console               v1.1.5  Symfony Console integration for Kdyby components
kdyby/doctrine              v0.10.3 Doctrine integration into Nette Framework
kdyby/doctrine-cache        v1.1    Doctrine Cache bridge for Nette Framework
kdyby/events                v1.2.4  Events for Nette Framework
nette/nette                 v2.0.13 Nette Framework - innovative framework for fast and easy development of secured web applications in PHP. Write less, have cleaner code and your work will bring you joy.
symfony/console             v2.3.7  Symfony Console Component

EDIT 2:
No chyba z neznámou fciou IF ostáva.

Editoval orech (20. 11. 2013 16:33)

frosty22
Člen | 373
+
0
-

Tak Kdyby\Doctrine už máš nainstalované správně, teď otázka máš v NEONu uvedené, to co ti psal HosipLan? A zároveň otázka dvě, nevytváříš někde instanci Doctrine\EntityManageru? a používáš tu službu, kterou ti předá to extension do contajneru, čili Kdyby\Doctrine\EntityManager?

orech
Člen | 40
+
0
-

V neone to mám tak, ako mi napísal HospiLan:

doctrine:
	connection: %database%
	console: true
	dql:
		string:
			IfElse: DoctrineExtensions\Query\Mysql\IfElse

Druhej časti moc nerozumiem. Kdyby mám zaregistrované v app/bootstrap.phphttps://github.com/…/en/index.md

Následne v neone:

services:
	database: @doctrine.entityManager

EDIT:
Upravil som neon:

extensions:
	console: Kdyby\Console\DI\ConsoleExtension
	events: Kdyby\Events\DI\EventsExtension
	annotations: Kdyby\Annotations\DI\AnnotationsExtension
	doctrine: Kdyby\Doctrine\DI\OrmExtension

doctrine:
	user: @parameters.database.user
	password: @parameters.database.password
	dbname: @parameters.database.dbname
	metadata:
		App: %appDir%

	#connection: %database%

	console: true

	dql:
		string:
			IfElse: DoctrineExtensions\Query\Mysql\IfElse

A dostanem chybovú hlášku: Found sections ‚extensions‘ in configuration, but corresponding extensions are missing.

Editoval orech (21. 11. 2013 8:39)

jiri.pudil
Nette Blogger | 1029
+
0
-

V té dokumentaci to možná není dost explicitně napsané: sekce extensions je dostupná až v dev Nette. Ve 2.0 musíš volat statické metody register.

orech
Člen | 40
+
0
-

Ok, díky za upresnenie. Z neonu som to odstránil, nechal som to len v bootstrap.php. Aktuálne v neone, kde sa volal EntityManager mi hodí chybu:

Nette\DI\ServiceCreationException Reference to missing service ‚doctrine.entityManager‘

services:
    database: @doctrine.entityManager
Filip Procházka
Moderator | 4668
+
0
-

Proč definuješ nějakou službu database? To vůbec není potřeba, prostě si vyžádej Kdyby\Doctrine\EntityManager a nějaké jména služeb úplně ignoruj.

Tvůj neon teď má vypadat takto:

doctrine:
    user: 'uzivatel'
    password: 'heslo'
    dbname: 'dbnae'
    metadata:
        App: %appDir%

    dql:
        string:
            IfElse: DoctrineExtensions\Query\Mysql\IfElse

Na parameters se vykašli, prostě to tam rovnou napiš. A navíc jsi to měl stejně špatně, protože parameters se předávají pomocí %, tak jako je v metadatech složka %appDir%

orech
Člen | 40
+
0
-

database ďalej využívajú iné služby:

services:
	database: @doctrine.entityManager
	authenticator: UserModule\Authenticator( @database::getRepository('UserModule\User') )
	mapService: MapModule\Services\MapService( @database )
	#...atd

Tie rozšírenia pre MySQL som nakoniec rozbehal tak, že som pridal do metódy injectEntityManager v BasePresenter.php:

$em->getConfiguration()->addCustomStringFunction('IF', 'DoctrineExtensions\Query\Mysql\IfElse');
Jiří Nápravník
Člen | 710
+
0
-

orech napsal(a):

database ďalej využívajú iné služby:

services:
	database: @doctrine.entityManager
	authenticator: UserModule\Authenticator( @database::getRepository('UserModule\User') )
	mapService: MapModule\Services\MapService( @database )
	#...atd

Pokud používáš Kdyby\Doctrine, tak tohle není ideální, protoežý předáváš repository vytahané přes Doctrine EntityManager. V Kdyby bys měl využívat tzv. DAO objekty a pak by tedy měli ten config vypadat takto:

services:
	- UserModule\Authenticator( @doctrine.dao('UserModule\User') )
 	#...atd

předávání toho EntityManager jako máš u té mapservice je naprd. Správně je v neonu jen zapsat službu:

services:
	- MapModule\Services\MapService

a v konstruktoru te MapSerice uděláš konstruktor:

public __construct(\Kdyby\Doctrine\EntityManager $em){
...
}

A budeš tam mít automaticky ten entity manager díky autowire

pojmenovávat services, pokud k tomu nemáš rozumný důvod je zbytečné.

orech
Člen | 40
+
0
-

Hm, ak mám postavenú aplikáciu na repozitároch, tak potom by som musel všetko prehodiť na DAO objekty, ak má fungovať Kdyby?

Editoval orech (22. 11. 2013 12:47)

Filip Procházka
Moderator | 4668
+
0
-

Pokud jsi repozitáře dědil, tak budeš mít problém, pokud ne, pojede to v pohodě.

orech
Člen | 40
+
0
-

Hm, tak asi to odložím, keď budem rozbiehať nový projekt :)

Ďakujem veľmi pekne všetkých zúčastneným za pomoc a trpezlivosť pri riešení môjho problému.