Jak vyměnit RobotLoader za Composer?

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

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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.