Jak vyměnit RobotLoader za Composer?
- Jiří Nápravník
- Člen | 710
Chtěl bych vyměnit RobotLoader za Composer. Po té, co podporuje i PSR-4, tak to není prý problém a někteří lidi to i používají, co vím. Komponenty, modelové třídy apod, přes něj načítám v pohodě, ale mám problém s presentery.
Mám tuhle strukturu:
app/
├── UserModule
| ├──FrontModule
| | ├── presenters
| | | ├── UserPresenter
pro tenhle UserPresenter mám namespace jako UserModule\FrontModule\UserPresenter;
chápu proč se to nenačítá, mám tam tu složku presenters. Ale jak jinak na to? Jak to řešíte vy, co jste nahradil RobotLoader?
- Tomáš Kolinger
- Člen | 136
Composer se stará o načtení knihoven. A složka app není z jeho pohledu knihovna a neví o ní…
Takže pokud vyhodíš RobotLoader musíš ho nějak nahradit a použít v bootstrapu jiný loader. Jestli použiješ implementaci PSR-4 composeru či jinou je už fuk.
PSR-4, namespace musí odpovídat složce. Takže to musíš rozdělit do složek. Což je hodně otravné a proto osobně nepoužívám PSR-0/4 loader na třídy aplikace.
Editoval Tomáš Kolinger (22. 2. 2014 20:32)
- David Matějka
- Moderator | 6445
tak jestli chces pouzivat PSR-4, budes muset mit strukturu s PSR-4 kompatibilni :)
ja nechavam app robot loaderem indexovat, classmap pak predam composeru, ktery se postara o loading, takze v bootstrapu:
<?php
/** @var \Composer\Autoload\ClassLoader $composer */
$composer = require __DIR__ . '/../vendor/autoload.php';
....
$robotLoader = $configurator->createRobotLoader()
->addDirectory(__DIR__)
->register();
$composer->addClassMap($robotLoader->getIndexedClasses());
- Jiří Nápravník
- Člen | 710
Tomáš : Pokud dám do composer.json, který mám v rootu:
"autoload": {
"psr-4": {
"": "app/"
}
}
tak mi to vidí ty třídy – komponenty a modelové třídy, problém je jen s presentery
matej21: Mě na RobotLoaderu vadí, že mi nehlídá překlepy v názvech tříd/souborech/namespaces, tka bych se nejraději vyhl RobotLoader úplně.
PSR-4 kompatibilní struktura ok, ale jak toho docílit? Asi by řešením byla struktura podobná té, co je v RFC . Jenže nejsem schopný nastavit správně mapping presenterů, či co je třeba…
Editoval Jiří Nápravník (22. 2. 2014 22:22)
- David Matějka
- Moderator | 6445
tak mas dve moznosti – bud presentery davat primo pod UserModule (ne do slozky presenter), nebo pod UserModule udelat jeste namespace Presenters (s tim, ze slozku prejmenujes – velky P) a upravis mapping, zhruba takhle
nette:
application:
mapping:
*: *Module\Presenters\*Presenter
- Jan Tvrdík
- Nette guru | 2595
PSR-4 kompatibilní struktura ok, ale jak toho docílit?
Jestli se ptáš takhle blbě, tak bych řekl, že jsi vůbec nepochopil, jak
funguje PSR-4. Doporučuji tedy znovu přečíst odpovídající specifikaci.
Na mapping presenterů přece vůbec není potřeba šahat, stačí dát
presentery na místo, které jednoznačně plyne z PSR-4 definice.
Pochopitelně pokud chceš dát presentery do jmenného prostoru
Presenters
, tak musíš upravit mapping.
Asi by řešením byla struktura podobná té, co je v RFC.
To asi dost těžko, vzhledem k tomu, že to není PSR-4 kompatibilní struktura.
- vitkutny
- Člen | 73
Příklad struktury s autoloadingem PSR-4: https://github.com/webedit/shop
Presentery jsem vyřešil tak že každý modul má vždy jen jeden presenter
(využívám submoduly).
Mapping mám:
*: AppName\*\*
a presenter se nemění podle URL, výchozí je vždy ‚Presenter‘, takže pak namespace presenterů vypadá takto:
AppName\Presenter //basePresenter pro celou app
AppName\Shop\Presenter //basePresenter pro modul
AppName\Shop\Category\Presenter
AppName\Shop\Product\Presenter
....
Editoval vitkutny (23. 2. 2014 0:14)
- Jiří Nápravník
- Člen | 710
Jan Tvrdík: Já se spíše blbě vyjádřil, chtěl jsem prostě jestli nějak jde vložit presentery do složky presenters bez namespace. Ale evidentně nejde. Já si myslel nějak blbě, že mapping jde nastavit podle složek a ne jen podle namespacu, ale nějak jsem zapomněl, že RobotLoaderu je jedno kde to mám uložený
vitkutny: díky za ukázku!
- Jan Tvrdík
- Nette guru | 2595
Jiří Nápravník napsal(a): chtěl jsem prostě jestli nějak jde vložit presentery do složky presenters bez namespace.
Což je právě PSR-4 nekompatibilní uvažování. Složky určuje PSR-4, ty si volíš namespace.