Vlastní rozšíření – jak použít hodnoty z configu v modelu?

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

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

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

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

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.

CZechBoY
Člen | 3608
+
0
-

Pripadne ti blog extension muze registrovat nejakou trapnou sluzbu ktera jen bude vracet zadanou konfiguraci pro blog… treba BlogConfig.
Nevim jestli to tak @Šaman myslel, nebo myslel globalni konfiguraci uplne vseho.

Editoval CZechBoY (4. 1. 2018 19:55)

Šaman
Člen | 2666
+
0
-

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)

CZechBoY
Člen | 3608
+
0
-

hm, stejne se mi to nelibi… zmenis nazev parametru a budes to muset menit na X mistech… neni to o moc lepsi reseni nez to tahat z dic