Oznámení
Multiple Connection – registrace v LeanMappru a vytvoření připojení podle přihlášeného uživatele
- VojtaSim
- Člen | 55
Zdravím,
narazil jsem na problém jak se připojit k dvěma databázím, z nichž
přihlašovací údaje k té druhé získám až podle přihlášeného
uživatele. Kdybych v BasePresenteru::startup()
zaregistroval nové
Connection tak by vzniky 2 problémy:
- nemohl bych tu instanci předávat auto-wiringem (což je asi špatné protože v EntityFactory se to určitě využije)
- dotazy by se nezobrazovaly v debug-baru
Na Nette/Dibi fóru jsem našel tento způsob pro více připojení, který naspal @EIFEL, ale není mi jasné jak se v takovém případě registruje LeanMapper (imho by to chtělo návod kde jsou uvedeny způsoby jak registrovat LeanMapper protože tohle extension mi už úplně zmátlo hlavu.
Nicméně i kdyby se mi povedlo zprovoznit způsob uvedený výše, stále zbývá otázka jak vytvořit druhé připojení podle přihlášeného uživatele.
Zatím jsem registroval 2 připojení:
- default je stálé připojení a nemění se
- backend je připojení, jehož údaje by se měly získat až z User\Identity
// config.neon
parameters:
database:
default:
driver: mysql
host: HOST
username: USER
password: PASSWORD
database: DATABASE
profiler: true
backend:
driver: mysql
host: HOST
username: USER
password: PASSWORD
database: DATABASE
profiler: true
Takhle prozatím registruji služby a LeanMapper
// config.services.neon
services:
connection:
class: LeanMapper\Connection( %database.default%, Default connection )
setup:
- registerFilter('sort', [@sorter, 'sort'], 'p')
- registerFilter('priority', [@sorter, 'priority'], 'p')
- registerFilter('translateFromEntity', [@translator, 'translateFromEntity'], 'ep')
- registerFilter('translate', [@translator, 'translate'])
- AdminModule\Model\Mapper
- LeanMapper\DefaultEntityFactory
### FILTERS ###
translator:
class: AdminModule\Model\Filter\Translator
sorter:
class: AdminModule\Model\Filter\Sorter
Nette 2.1 | LeanMapper 2.2.0
btw. stojí nette 2.2 za upgrade?
- castamir
- Člen | 631
Ano, vyplatí se aktualizovat na Nette 2.2, ale je tam pár BC breaků, tak opatrně.
Jak přidat debugbar se můžeš inspirovat v compilerExtension nebo v konstruktoru DibiConnection (jen pozor, v prvním odkazu vytváříš panel pro Nette 2.2, zatímco ve druhém registruješ panel pro Nette 2.1). Nezapomeň ale, že budeš potřebovat stejnou instanci Panelu pro oba, jinak budeš mít v panelu pro každou db jednu záložku…
Elegantní řešení druhého připojení mě nenapadá. Nejspíš budeš potřebovat nějakou novou službu, která ti za určitých podmínek vytvoří (ručně) novou instanci. Ale mám určitě pochybnosti, že se ti to podaří protlačit přes DI až do entity factory…
- VojtaSim
- Člen | 55
Dostat Connection
k EntityFactory možná nebude ani třeba,
stačí, když ho dostanu k Result
, protože to je poslední
z obálek, která si nese $connection
(dále je už jen Row a pak
Entity). Ale špatné je to, že Result
dostává
Connection
podle Repositáře, ve kterém vzniká, tzn. že když
se z Entity1, která náleží do databáze 1 odkážu přes property na
Entity2 z databáze 2 tak to nebude fungovat protože Result, který je
obalený v Entity1 má Connection na databázi 1 a já potřebuji Connection
na databázi 2.
Takhle to alespoň funguje, když se v configu vytvoří 2 DibiConnection a potom se už jenom předává jednotlivým repositářům connection, které potřebují
defaultConnection:
class: LeanMapper\Connection( %database.default%, Default )
backendConnection:
class: LeanMapper\UserConnection // __construct(User $user)
// u registrace repositáře použiju buď @defaultConnection nebo @backendConnection
Zde je problém v Result se používá Connection svého Repositáře místo Connection cílohévo repositáře
Možná by se dalo předávat 2 Connection přes všechny obálky DibiRow a Repositáře a podle Mappru se rozhodovat které se použije, ale byla by to velká prasárna a s upgradováním LeanMappru asi konec.
Editoval VojtaSim (24. 6. 2014 18:08)