Jak nejčistějí na basePath v modelu

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Lukeluha
Člen | 130
+
+1
-

Ahoj,

řeším věc, jak nejčistěji zjistit basePath v modelu. Má situace je taková: mám entitu user, a v něm chci implementovat metodu getProfilePicture(). V této metodě chci zjistit, jestli existuje profilová fotka konkrétního uživatele, která by měla být dostupná pod /www/images/users/pictures/id-uzivatele.jpg. Pokud by fotka existovala, vrátím jí jako instanci Image. Zároveň ale nevím, jak přesně zjistit basePath v této entitě, popřípadě jak jinak mám vymyslet cestu k obrázku jinak, než nějakou relativní z aktuální entity.

Předem díky za odpovědi.

Editoval Lukeluha (26. 3. 2015 11:48)

Jan Tvrdík
Nette guru | 2595
+
0
-

basePath se URL cesta, model by měla zajímat spíš disková cesta, ne?

ali
Člen | 342
+
+5
-

ja bych to resil pres config

services:
	muj.model: Namespace\Model(%wwwDir%)

Editoval ali (26. 3. 2015 11:55)

Filip Klimeš
Nette Blogger | 156
+
0
-

Teoreticky můžeš předat base path v parametru metody getProfilePicture($basePath).

Přijde mi ale, že tahle logika je spíše prezentační, proto bych ji umístil mimo model. User by Ti pouze vrátil id, maximálně název soboru a nějaký jiný helper/služba by se podívala, zda-li soubor existuje.

Uvaž sám – má třída nesoucí data a nějakou logiku nad nimi mít také znalost o adresářové struktuře? Je to správně v rámci SRP? Dobře napsaná třída by měla mít jen jeden důvod ke změně, tady máš dva – změna modelu nebo změna adresářové struktury.

greeny
Člen | 405
+
+1
-

Předpokládám, že máš nějakou službu ImageUploader. Ta by si měla z configu vyžádat nějakej parametr imagePath. Ten taky přes nějakou službu dostaneš do šablony.

No a v šabloně pak vypisuješ fotky takhle:

<img src="{$basePath}/{$imagePath}/{$user->getProfilePicture()}">
Lukeluha
Člen | 130
+
0
-

jj, to je vlastně pravda :)

takže myslíš že je v pohodě použít __DIR__ a od toho jít relativně k tomu obrázku?

Jan Tvrdík
Nette guru | 2595
+
0
-

Lépe si předat cestu ke složce s obrázky konstruktorem.

Vojtěch Dobeš
Gold Partner | 1316
+
+3
-

Můžeš využít dotblue/nette-webimages knihovnu (composer require dotblue/nette-webimages:@dev). V šabloně vytvoříš odkaz následovně:

<img n:src="$user->getId(), user => true">

Vytvoříš si UserProfileProvider:

class UserProfileProvider implements DotBlue\WebImages\IProvider
{

	/** @var string */
	private $wwwDir;



	public function __construct($wwwDir)
	{
		$this->wwwDir = $wwwDir;
	}



	public function getImage(DotBlue\WebImages\ImageRequest $request)
	{
		$parameters = $request->getParameters();

		if (!isset($parameters['user'])) {
			return;
		}

		$path = $this->wwwDir . '/originals/user-profiles/' . $request->getId() . '.jpg';

		if (is_file($path)) {
			return Nette\Image::fromFile($path);
		}
	}

}

Konfigurace v NEONu bude vypadat následovně:

extensions:
	webimages: DotBlue\WebImages\Extension

webimages:
	routes:
		- mask: images/users/pictures/<id>.jpg
		  defaults: [user: true]
	providers:
		- UserProfileProvider( %wwwDir% )

Knihovna se ti postará o automatické vytváření obrázků, jejich uložení atd. Pokud bys chtěl profilovky nějak dál upravovat (ořez apod.), můžeš tak libovolně činit v UserProfileProvider.

Lukeluha
Člen | 130
+
0
-

To vypadá dobře :) ale přece jen bych se ještě zeptal… Mám zkušenosti spíše se starým Nette (0.9), kde není DI. Proto přesně ani nevím jak na configy, atd. Každopádně já používám Kdyby\Doctrine a entita User je má Identity. Mám vytvořený autentikátor UserService, který mám v configu a v konstruktoru do něj injektuji EntityManager z knihovny Doctrine. Pokud bych si do této servicy chtěl ještě injektovat proměnnou wwwDir, musel bych v configu nějak předat i entityManager a to úplně nevím jak… neco jako:

services:
	authenticator: UserService(EntityManager, %wwwDir%)

Navíc počítám, že někde musím sehnat továrničku na EntityManager, ale to opravdu nevím kde

Editoval Lukeluha (26. 3. 2015 13:57)

ali
Člen | 342
+
0
-

Pouzij ‚@‘

services:
    authenticator: UserService(@EntityManager, %wwwDir%)
akadlec
Člen | 1326
+
0
-

Já to řeším obdobně jako Vojta. Mám na práci s obrázky extension a ta má v sobě několik storage služeb které se mi starají o správné zpracování obrázku. V šabloně jen řeknu jaké storage se má použít a jaký obrázek zobrazit.