Ziskavanie zavislosti inak
- marioff
- Člen | 69
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
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
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
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
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
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.....
:(
- marioff
- Člen | 69
{
"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
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
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
@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.