DateTime service registrace

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

Ahoj,

dostal jsem hlášení: Service ‚analyzeday‘: Service of type DateTime needed by AnalyzeDay::__construct() not found. Did you register it in configuration file?

ale nevím, jak se ho zbavit. Mám třídu v modelu, které musím nutně do konstruktoru předávat jako parametr objekt typu DateTime z PHP, ale nette za každou cenu chce, abych typ DateTime nějak registroval. Je možné to nějak obejít, prosím? Pro úplnost dávám kus zdrojáku:

class AnalyzeDay extends Nette\Object {

  private $analyzeLiturgicYear;

  private $date;

  public function __construct(DateTime $date, AnalyzeLiturgicYear $analyzeLiturgicYear){

a config.neon:

	services:
		authenticator: Authenticator
		authorizator: Authorizator
		routerFactory: RouterFactory
		router: @routerFactory::createRouter
		analyzeliturgicyear: AnalyzeLiturgicYear
		analyzeday: AnalyzeDay
		calendar: Calendar

Nevíte někdo, prosím, jak na to?

matopeto
Člen | 395
+
0
-

Skorej je otazka co je to za DateTime, odkial sa berie, kto ho vytvara :) Riesenim je bud sluzba, alebo factory, ktora ti ten alalyzeDay vytvori. Nette ti samo dateTime nevyrobi.

had12
Člen | 28
+
0
-

Snažím se integrovat několik tříd původně psaných bez nette do struktury nette a moc se mi to nedaří. Myšlenka byla taková:

include_once "analyzeLiturgicYear.php";
include_once "analyzeDay.php";

$aly = new analyzeLiturgicYear("2014");		// vrátí objekt analyzeLiturgicYear, který obsahuje info o konkrétním roce
$day = new DateTime("2014-01-01");
$ad = new analyzeDay($day, $aly);	// vrátí info o konkrétním dni v daném roce, které je závislé na předchozí analýze roku 2014.
echo $ad->debug();

ale nevím, jak to zapsat do nette… myslel jsem, že stačí analyzeLiturgicYear a analyzeDay zaregistrovat jako služby a problém je vyřešený… :-(

Editoval had12 (11. 11. 2014 20:36)

Šaman
Člen | 2666
+
0
-

Tohle ale nejsou služby! Tady je operátor new na místě. Taky přece nemáš službu na DateTime, ale pokud potřebuješ objekt s datumem, vytvoříš nový DateTime.
Takže includy nejsou potřeba (pokud na ty třídy vidí RobotLoader), ale nekomplikuj to s žádnýma službama a DI kontejnerem, to tu nemá co dělat. Budeš s nimi pracovat stejně, jako bez Nette.

P.S. Jen, pokud máš možnost upravit kód těch tříd, tak v Nette je zvykem psát třídy velkým písmenem. Tedy

<?php
use DateTime; # nebo Nette\DateTime

$aly = new AnalyzeLiturgicYear("2014");
$day = new DateTime("2014-01-01");
$ad = new AnalyzeDay($day, $aly); # a doporučuji popisnější název proměnných
?>

Editoval Šaman (11. 11. 2014 20:58)

had12
Člen | 28
+
0
-

Zatím jsem si vždycky vystačil s tím, co jsem ukuchtil v nette. Tenhle ukázkovej kód jsem jen tak narychlo splácnul tady, aby bylo jasný, jakým způsobem jsem to dřív používal (proto ty nepopisný proměnný a názvy tříd s malým). Zkusím to a příp. se ještě ozvu. Díky za pomoc.