Vytvoření fully qualified url

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

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:

  1. Přidat do PhotoEntity metodu getFullUrl(), která bude využívat Http\Url k vytvoření celého URL.
  2. Přidat metodu getFullUrl($photo) někam jinam. Kam?
  3. 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
+
+3
-

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

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

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

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

@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.

Jan Mikeš
Člen | 771
+
0
-

@CZechBoY typo :D díky, opraveno