Services: kompozice x dedicnost, práce s cestami k souborům
- darthcz
- Člen | 113
Zdravím,
chci se zeptat, jak řešíte práci se soubory a obrázky.
Vytvořil jsem si služby FileService a ImageService, které mi zpracovávají business logiku práce se soubory. Ve službě FileService mám funkce jako – smaž soubor, rekurzivně smaž složky, vytvoř složku vytvoř soubor, kopírování souborů a složek, zjištění existence souboru a složky (název file jsem zde využil i pro adresáře dle linuxové konvence ,,všechno je soubor"). Ve službě ImageService mám pak funkce, které vrací povolené přípony, rozměry obrázků, přesun obrázků, zpracování nahraného obrázku apod.
Narazil jsem v podstatě na dva problémy, se kterými bych vás rád požádal o radu.
- Řešili byste vztah mezi FileService a ImageService kompozicí nebo dědičností? ImageService je totiž v podstatě jen typ souboru a využívá některé funkce FileService a některé rozšiřuje (přesun souboru), takže by se hodila dědičnost. Nadruhou stranu ve FileService implementuji i práci se složkami, které nemají s obrázky nic společného.
Napadlo mě nechat ve FileService jen základní funkce a od něj dědit služby pro typy Icon, Directory, Image …
- Kam dáváte informace o cestách k souborům? Řekněme, že mám složky www/images, www/uploads, www/uploads/temp, www/uploads/modules, www/uploads/modules/MODULE_ID/services/SERVICE_ID … Mám si na to vytvořit nějakou další službu? Například PathService? Pokud by některé cesty nebyly dynamické, narval bych to do configu, ale tady to moc nejde. Zvolil jsem přístup, že dávám fixní cesty do FileService a cesty k obrázkům do ImageService, ale to mám vždycky jednu funkci na path k obrázku a další na src (getImagePath, getImageSrc, getIconPath, getIconSrc …) :-/
Za odpověď případně nasměrování na nějaký materiál s ukázkou předem děkuji.
- Filip Procházka
- Moderator | 4668
Využil bych symfony/filesystem a pracoval takto
use Symfony\Component\Filesystem\Filesystem as IO;
class ImageStorage extends Nette\Object
{
/** @var IO */
private $io;
/** @var string */
private $dir;
public function __construct($dir, IO $io)
{
$this->dir = $dir;
$this->io = $io;
}
}
A následně v metodách pracoval se soubory pomocí
$this->io
relativně od $this->dir
:)
- darthcz
- Člen | 113
To vypadá zajímavě, takže odpověď na moji otázku je v podstatě provázání pomocí kompozice. Nicméně někde potřebuji stejně získávat tu cestu, kterou předám ImageStorage jako $dir. Pokud budu pracovat nad úložištěm www/uploads/modules/$module/services/$service/icons/, tak potřebuji někde tuto cestu získat, abych ji neměl zapsanou na hromadě míst, ale měl to pouze na jednom místě, tak aby mě třeba změna uploads na storage nestála přepisování na hromadě míst. Kam bys dal metody na sestavování a získávání cest?
- Filip Procházka
- Moderator | 4668
Myslím, že to moc komplikuješ :) Ale napadá mě třeba
abstract class BaseModule extends Nette\Object
{
public function getStorage()
{
return new ImageStorage($this->moduleDir . '/images', $this->io);
}
}