Ziskavanie zavislosti inak

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

Caute,

dovolim si taku zaciatocnicku otazku:

Je mozne nejak dosiahnut aby som napr. v nejakej triede zavolal nejaku instanciu (sluzbu zaregistrovanu cez config) inak ako injektnutim? Je to mozne?

napr. aby som v nejakej metode zavolal inu metodu z inej sluzby, bez toho aby som musel tuto zavislost ziskavat cez konstruktor, alebo injektnutim???

abstract class Repository extends Object
{

	function getRepository($repo)
	{
		return instancia;
	}

}


class NotificationRepository extends Repository
{

	function zisti_data()
	{
		return ...data...;
	}

}


class UserRepository extends Repository
{

	function data()
	{
		return $this->getRepository('Notification')->zisti_data();
	}

}

velmi by mi pomohla akakolvek rada. Tried je vela, a rucne to vypisovat bude peklo a delit to na mensie casti este vacsie :(.. dakujem

Filip Procházka
Moderator | 4668
+
+3
-

Ano je, ale nebudu ti říkat jak, protože ta cesta kterou se chceš vydat je překonaná, zastaralá a problémová. Použij normálně injektování :)

marioff
Člen | 69
+
0
-

ok Filip, uz som nad tym uvazoval a to ze nebudem vediet na prvy pohlad zavislosti mi zato nestoji…

poradis mi ako v tvojom kdyby/doctrine mozem pouzit tie vlastne repozitare? do anotacie entity pridam

@ORM\Entity (repositoryClass=„Model\Repository\Nazov“)

repozitar zadam do config.. ale vypise mi chybu ze musim cez konstruktor dodat triede Doctrine\ORM\EntityRepository entity manager a tusim to bolo metaclass. Asi by som to mal cez config, ale netusim odkial ich tam vziat :(

mozno je to nieco co hladam, a co by mi situaciu ulahcilo :(

EDIT:

tak som asi nato prisiel.. staci pridat do anotacie (repositoryClass=" ") , vytvorit repozitar a v nom metodu mojaSuperNovaMetoda, a funguje to takto?

$this->em->getDao(‚Model\Entity\User‘)->mojaSuperNovaMetoda(); ???

uz netreba nikde nic pridavat?

Editoval marioff (8. 1. 2015 21:31)

marioff
Člen | 69
+
0
-

aha, takze som zistil, ze uz ziadnu inu zavislost (napr. vlastny validator) do neho asi nepridam :((( , tak som zase asi tam kde som bol

mkoubik
Člen | 728
+
+1
-

Jako že si vytváříš vlastní třídu pro repozitář a přidáváš do ní závislost jen proto, abyses k té závislosti dostal někde kde máš k dispozici entity manager?

V čem je to jednodušší než to prostě injectnout přes konstruktor?

marioff
Člen | 69
+
0
-

jednoduchsie v tom ze nemusim vo fasade injektovat vsetky repozitare ktore fasada potrebuje.. myslel som si ze zavolam

$this->em->getDao(‚Model\Entity\User‘)->mojaSuperNovaMetoda();

a mozem v tom repozitari riesit vsetko, vratane validacie dat a mam pokoj. Validaciu totiz nikde inde uz nepotrebujem (teda este vo formularoch, ale to som si vyriesil, aby fungovala aj pre ne).

asi sa nevyhnem teda vypisovaniu vsetkych moznych zavislosti uz vo fasade :(

Filip Procházka
Moderator | 4668
+
0
-

Právě jsem do Kdyby/Doctrine commitl podporu RepositoryFactory, což je nová feature řady 2.4 a používá se takto

# app/config/config.neon
services:
    -
        class: App\ArticlesRepository(%entityManager%, %metadata%),
        parameters: [entityManager, metadata]
use Doctrine\ORM\Mapping\ClassMetadata;

class ArticlesRepository extends Kdyby\Doctrine\EntityRepository
{
	private $nejakaDalsiZavislost;

	public function __construct($em, ClassMetadata $class,
		Moje\Trida $nejakaDalsiZavislost)
	{
		parent::__construct($em, $class);
		$this->nejakaDalsiZavislost = $nejakaDalsiZavislost;
	}


	public function customMethod()
	{
		// ...
	}
}

Pokud to chceš vyzkoušet, tak potřebuješ aktuální master

"require": {
	"kdyby/doctrine": "dev-master"
marioff
Člen | 69
+
0
-

to bolo medzi prvymi pokusmi ktore som skusal a jasne ze mi to neslo :D … oki idem to vyskusat.. dakujem

Editoval marioff (10. 1. 2015 15:15)

marioff
Člen | 69
+
0
-

asi to nevyskusam, projekt je napisany v nette 2.1.5 a po update cez composer sa mi nic nezobrazi (niekde to zdochne v nacitani suborov)

a composerovi mi zobrazuje chybu:

Failed to download kdyby/doctrine from source: Failed to clone git@github.com: Kdyby/Doctrine.git git was not found.....

:(

Jan Endel
Člen | 1016
+
0
-

hod jsem tvuj composer.json, to se mi nak nezda.

marioff
Člen | 69
+
0
-
{
	"name": "nette/sandbox",
	"description": "The sandbox is a pre-packaged Nette Framework project, basic configured structure for your application.",
	"homepage": "https://nette.org",
	"type": "project",
	"license": ["BSD-3-Clause", "GPL-2.0", "GPL-3.0"],
	"authors": [
		{
			"name": "David Grudl",
			"homepage": "http://davidgrudl.com"
		},
		{
			"name": "Nette Community",
			"homepage": "https://nette.org/en/contributors?lang=en"
		}
	],
	"require": {
		"php": ">= 5.3.0",
		"nette/nette": "~2.2.0",
		"dg/adminer-custom": "1.*",
		"positivezero/gettext-translator": "dev-master",
		"kdyby/doctrine": "dev-master",
		"kdyby/forms-replicator": "@dev",
		"rixxi/gedmo": "@dev",
		"nextras/forms": "1.3.*@dev",
		"o5/grido": "1.0.5",
		"vojtech-dobes/nette-forms-gpspicker": "1.2.0",
		"kollarovic/thumbnail": "@dev",
		"janmarek/webloader": "@dev",
		"oyejorge/less.php": "~1.5",
		"jeroendesloovere/vcard": "dev-master",
		"jkuchar/pdfresponse": "dev-master"
	},


	"require-dev": {
		"nette/tester": "~0.9.5"
	},
	"require-all": true
}

upravil som len nette/nette a kdyby/doctrine

Editoval marioff (10. 1. 2015 15:35)

marioff
Člen | 69
+
0
-

jedine co som tak nasiel tak napr. v autoload_files su v poli subory:

$vendorDir . ‚/nette/nette/Nette/common/shortcuts.php‘, – subor je vsak v /nette/nette/Nette/shortcuts.php

ale aj tak sa nic nezobrazi

marioff
Člen | 69
+
0
-

nemala by byt zabezpecena aspon nejaka spatna kompatibilita medzi 2.1 a 2.2 ? Skusal som uz vsetko, aj postupne pridavat balicky a sledovat chyby, akonahle pridam posledny potrebny balicek, tak appka uz uplne prestane odpovedat a nevrati nic…

teraz ani netusim co vlastne menit / upravit ked mi to nic nevrati..

marioff
Člen | 69
+
0
-

uz sa mi to podarilo rozchodit, uz len trosku upravit namespace ktore blbnu a vyskusam to..

marioff
Člen | 69
+
0
-

potvrdzujem funkcnost, ale nakoniec to nevyuzijem asi :(, pretoze som sa dostal do kruhovej zavislosti, nenapadlo ma bohuzial predtym ze validator si zavola v podstate ten repozitar kde musi tiez existovat ako zavislost :(

marioff
Člen | 69
+
0
-

predsa som narazil na nejaky problem:

pri volani countBy dostanem chybu:

use Kdyby\Doctrine\EntityRepository;

class TranslatableEntityRepository extends EntityRepository

BadMethodCallException

Undefined method ‚countBy‘. The method name must start with either findBy or findOneBy!

:(

Filip Procházka
Moderator | 4668
+
+1
-

@marioff kdyby ten repozitář byl správně napárovaný na entitu, tak by ti to takovou chybu nehodilo, protože ta metoda existuje.

Ukaž jak jsi naparoval repozitar na entitu a pokud ho mas jako sluzbu, tak idealne i relevantni cast configu.

marioff
Člen | 69
+
+1
-

jjj ved to mi bolo zvlastne, lebo urcite existuje… vdaka tomu sa problem vyriesil, bol totiz v inom rozsireni (gedmo) ktore dedi Doctrine\ORM\EntityRepository