Vlastní rozšíření – jak použít hodnoty z configu v modelu?
- theacastus
- Člen | 81
Zdravím,
uvedu vcelku jednoduchý příklad:
Mám ArticleFacade
a po ní chci, aby mi vrátila $articles, skrt
zkterá bych přes foreach
iteroval, s tím že
BlogExtension
má config:
blog:
articlesPerPage: 4
Jak se k hodnodě articlesPerPage
dostanu v
ArticleFacade
? Ideálně aby řešení bylo autowired a jen si
říct v konstruktoru ArticleFacade
, ale podle dokumentace to tak
jednoduché není – upřímně jsem to z dokumentace moc
nepochopil… :-(
A ještě jedna otázka navíc, je nějaké elegantní řešení stránkování v kdyby/doctrine? Nebo je nutné si na to napsat vlastní třídu které by to řešila v DQL? Protože mi přijde celkem elegantní řešení v nette/database:
$posts = $this->postFacade->getAllPostedPosts();
(...)
$posts->page($page, $itemsPerPage, $lastPage);
(...)
Chtěl jsem si vyzkoušet práci s Doctrine, protože mi vyhovuje OOP pohled na entity a na přístup k nim (sice je psaní getterů a setterů trochu otravné, ale PhpStorm je schopný pomocník :-D)
Díky :-)
Editoval theacastus (4. 1. 2018 0:04)
- Šaman
- Člen | 2666
Ad. předávání parametrů z configu do modelu. Viz. dokumentace
Čisté řešení je vyžadovat ten parametr v konstruktoru (pokud je nezbytný), nebo pomocí setteru. V configu se pak předá takto:
parameters:
blog:
articlesPerPage: 4
services:
- Blog\ArticleFacade(%blog.articlesPerPage%) # konstruktorem
- # setterem
create: Blog\ArticleFacade
setup:
- setArticlesPerPage(%blog.articlesPerPage%)
Méně čisté řešení je vytvořit si stejným způsobem třídu (třeba
Config) a té předat celý blok parametrů. K jednotlivým položkám se
dostaneš jako k položkám pole. A tuhle třidu už si můžeš injectovat
kam chceš standardním způsobem. Problém je, že když bude některý
důležitý parametr chybět, tak se to projeví až za běhu. V příkladu
výše by to při neexistenci %blog.articlesPerPage%
vyhodilo chybu
už při sestavování kontejneru.
Editoval Šaman (4. 1. 2018 1:30)
- theacastus
- Člen | 81
@Šaman ok, teď mi ale došlo že takto budu muset mít dvě fakády (front s parametrem blog.articlesPerPage a admin s admin.itemsPerPage), chápu li to správně?
Ale stejným způsobem by mělo jít si předat hodnotu do presenteru, jen hloupé bude to že když se presentery načítají automaticky, bez nutnosti je psát jako služby pro DI, přijdu o to – na druhou stranu častěji se mění články na webu než jména presenterů že :D
- Šaman
- Člen | 2666
Já někde používám i to méně čisté řešení. V configu mám v parametrech sekci „configuration“ a ve službách si pak vytvářím třídu, které předám celou tuhle sekci konstruktorem.
Tahle třída se pak dá injectovat kam je potřeba a dokáže
zprostředkovat libovolný parametr z té sekce. Používám to ale výhradně
na takové doplňkové nastavení, jako je třeba to tvoje
articlesPerPage
. (Předpokládám, že blog tuhle hodnotu
nevyžaduje, prostě vypíše všechny, nebo nějaký defaultní počet.)
Je to jednodušší na provázání (přidáš parametr do configu a v PHP si
pro něj rovnou sáhneš do té třídy), ale ze stejného důvodu je to
náchylnější na chyby. Ta informace o parametrech je totiž skrytá někde
hluboko v kódu a není součástí rozhranní. A DI kontejner nevyhodí
chybu, pokud nějaký povinný parametr bude chybět.
- Šaman
- Člen | 2666
Mám jen jednu službu Configuration
pro všechna nastavení a
k těm svým pak přistupuji:
<?php
$config = $this->configuration->getParameter('dashboard');
$pastDays = $config['pastDays'];
$futureDays = $config['futureDays'];
?>
parameters:
configuration:
dashboard:
pastDays: 60 # počet dní do minulosti, které vypisovat na Dashboardu
futureDays: 60 # počet dní do budoucnosti, které vypisovat na Dashboardu
logList:
# disabledProperties
services:
- App\Utils\Configuration(%configuration%)
Ale to je jen otázkou implementace. Ano, lepší by bylo mít třídu
DashboardConfig
, která mi vrátí jen moje parametry. A dokonce
by mohla kontrolovat jejich přitomnost v configu a případně je
i validovat. Takhle je to univerzální třida na pár řádků, která jen
zpřístupní parametry ze sekce ‚configuration‘.
<?php
namespace App\Utils;
use Nette\Object;
class Configuration extends Object
{
/** @var array */
protected $configuration;
/**
* @param array
*/
public function __construct($configuration)
{
$this->configuration = $configuration;
}
/**
* @param string
* @return mixed
*/
public function getParameter($name)
{
return $this->configuration[$name];
}
}
?>
Editoval Šaman (4. 1. 2018 23:01)