Jak nejčistějí na basePath v modelu
- Lukeluha
- Člen | 130
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)
- Filip Klimeš
- Nette Blogger | 156
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.
- Vojtěch Dobeš
- Gold Partner | 1316
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
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)