Jak udělat basePath statickou pro vytvoření placeholderu v Modelu
- Vokrik
- Člen | 15
Ahoj,
nevíte někdo, jak vyřešit následující situaci?
Mám entitu Member, která má následující metodu
<?php
public function getProfileImage($isInternal = FALSE, $force = FALSE)
{
if($this->profileImage !== NULL) {
return $this->profileImage;
} else {
return Image::getDefaultProfileImage();
}
}
?>
funkce getDefaultProfileImage vypadá takto:
<?php
/**
* @return Image
*/
public static function getDefaultProfileImage()
{
$image = new Image();
$image->setOriginal('http://localhost/myApp/www/images/placeholder.png');
$image->setLarge('http://localhost/myApp/www/images/placeholder.png');
$image->setMedium('http://localhost/myApp/www/images/placeholder.png');
$image->setSmall('http://localhost/myApp/www/images/placeholder.png');
return $image;
}
?>
Potřeboval bych sem nějak dostat $basePath, abych tady nemusel mít natvrdo absolutní url…
Předal bych ji nějak předal do Image, problém je, že metoda getDefaultProfileImage musí být statická, protože getProfileImage používám na Doctrine entitách, kam si konstruktorem nemůžu nic předat (zároveň i Image je entita, ale to by se dalo vyřešit přesunutím funkce na ImageService)
Napadlo mě, že by se dalo udělat tohle:
<?php
class ImageService {
public static $basePath;
public function __construct($basePath){
self::$basePath = $basePath;
}
}
?>
a pak to volat:
<?php
$image->setOriginal(ImageService::$basePath.'/images/placeholder.png');
?>
ale nepřijde mi to hezké, například proto, že není jisté, že se konstruktor ImageService zavolá (nemusím ImageService vůbec použít a díky lazy loadingu se proto nenainicializuje ani $basePath)
Neřešili jste někdo něco podobného?
Editoval Vokrik (25. 9. 2015 11:16)
- newPOPE
- Člen | 648
No, $basePath
nema v modeli co robit. Riesil by som to nejak
tak, ze model mi akurat dodat dajme tomu SplFileInfo a v danom helperi, makre, … si to uz spracujem
ako potrebujem.
A co tak to urobit tak, ze budes mat sluzbu ktora bude dynamicka (cize bude mat $basePath) a ta ti vrati nastaveny image. Cize cez nu prezenies entitu a je.
- Vokrik
- Člen | 15
No on je trochu problém, že si v databázi držím pouze absolutní url všech obrázků, protože je hostujeme na Amazon S3.. Takže pak v šablonách k tomu přistupuju takhle
<?php
<img n:src="$member->profileImage->large">
?>
A tam se mi vrazí buď absolutní url obrázku z amazonu, nebo absolutní url na serveru aplikace. To makro|filter by pak muselo zkoumat, jestli na začátku stringu té url je http:// nebo https://, a pokud ne, tak tam dát $basePath … Asi to není úplně špatný nápad, ale kdyby se to dalo udělat nějak bez parsování stringu, tak by to bylo hezčí