Konfigurácia Doctrine 2 funkcií v Nette 2
- orech
- Člen | 40
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)
- orech
- Člen | 40
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
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
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
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
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
Aha, ale to máš pouze čistou doctrine, ta konfigurační sekce začne fungovat, až nainstaluješ i Kdyby/Doctrine
- orech
- Člen | 40
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
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/
nebovendor/
, 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
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ť.
- orech
- Člen | 40
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
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
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.php
. https://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
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
.
- Filip Procházka
- Moderator | 4668
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
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
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é.
- Filip Procházka
- Moderator | 4668
Pokud jsi repozitáře dědil, tak budeš mít problém, pokud ne, pojede to v pohodě.