tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

Omlouváme se, provoz fóra byl ukončen

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:

  1. nemohl bych tu instanci předávat auto-wiringem (což je asi špatné protože v EntityFactory se to určitě využije)
  2. 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í:

  1. default je stálé připojení a nemění se
  2. 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)