Vytvoření fully qualified url
- David Kregl
- Člen | 52
Ahoj,
mám PhotoEntity (Doctrine), která v sobě drží hodnoty $image, $caption, $author. V šabloně potřebuji získat $fullUrl (včetně protokolu, domény, atp.) pro daný obrázek. Momentálně to řeším konstrukcí URL přímo v šabloně pomocí $_SERVER a stydím se za to. :) Jaký je best practice na řešení tohoto problému?
Napadají mě dvě možnosti:
- Přidat do PhotoEntity metodu getFullUrl(), která bude využívat Http\Url k vytvoření celého URL.
- Přidat metodu getFullUrl($photo) někam jinam. Kam?
- Vytvořit si komponentu, která přijme jako parametr $photo a vrátí mi fully qualified url.
Bohužel jsem přebral ‚‚velmi nešikovně řešený’’ projekt, a tak se snažím vyvarovat větším zásahům.
Děkuji
Editoval David Kregl (25. 10. 2016 13:21)
- jiri.pudil
- Nette Blogger | 1032
4. Napsat si latte filter, který přijme jako parametr $photo a vrátí
url. V šabloně to je pak jednoduché: {$photo|fullUrl}
- David Kregl
- Člen | 52
Proč to dělat jednoduše, když to jde složitě, že?
Moc děkuji, asi jsem se dostal do nějakého utopického přemýšlení nad tím, jak to vyřešit, až jsem přehlédl něco tak obvious.
Díky!
- David Kregl
- Člen | 52
Nakonec jsem skončil s tímhle. Je to v pořádku?
class FullUrl
{
public function __invoke($entity)
{
switch ($entity) {
case $entity instanceof Photo:
$url = 'http://www.ziskejtelo.cz/files/photos/original/' . $entity->getPhoto();
break;
// some other entities
default:
throw new Nette\InvalidArgumentException;
break;
};
return $url;
}
}
Editoval David Kregl (25. 10. 2016 17:57)
- Jan Mikeš
- Člen | 771
@DavidKregl toto pravděpodobně bude stačit, ale šel bych na to ještě jinak (znovupoužitelněji).
class MyClass
{
private $request;
private $uploadDir;
public function __construct($uploadDir, Http\Request $request)
{
$this->uploadDir = $uploadDir;
$this->request = $request;
}
public function getAbsolutePath($filename)
{
$url = rtrim($this->httpRequest->getUrl()->getBaseUrl(), '/');
return $url . DIRECTORY_SEPARATOR . $this->uploadDir . DIRECTORY_SEPARATOR . $filename;
}
}
Tuto třídu si zaregistrovat jako službu a registrovat metodu
getAbsolutePath()
jako helper.
Získáš tím třídu, kterou můžeš jednoduše kopírovat mezi projekty bez
toho, aby jsi v ní měl hardcoded url, protože složku si nastavíš
v configu:
parameters:
uploadDir: "upload/images"
services:
- MyClass(%uploadDir%)
Taktéž pokud využiješ toto řešení, můžeš parametr použít i ve třídě, kde uploaduješ → pokud budeš chtít uploadovat do jiné složky přepíšeš tedy jen parametr v configu a hotovo, namísto aby jsi musel do X míst a tam měnit hodnotu → menší prostor pro chybu.
Použití v šabloně by mohlo vypadat takto:
{$entity->getPhoto()|absolutePath}
Editoval Jan Mikeš (25. 10. 2016 18:38)
- CZechBoY
- Člen | 3608
@JanMikeš ještě bych podotknul, že to cos poslal je třída, nikoliv public function a v ní další funkce :-)
@DavidKregl
Jinak já bych to nenazýval absolutePath, ale konkrétně imagePath, …
Protože třeba videa můžeš skladovat jinde. Taky můžeš jinde skladovat
avatary uživatelů a to je vlastně taky obrázek. Trošku bych se zamyslel nad
tím názvem.