How to get dependencies in model?

Notice: This thread is very old.
TonnyVlcek
Member | 31
+
0
-

Hey,

At first I apologies for that elementary question, but, unfortunately, I haven't been able to find a way how to make this work, even though I tried a good bit of variants.

I need to call some method form different model class inside another model class:

<?php
class AaRepository extends BaseRepository
{
	public function getFromAa(){}
}
...
class BbRepository extends BaseRepository
{
	public function createSomething(){
		if([here I would like to call method getFromAa()]){}
	}
}
?>

Is there a way how to “inject” AaRepository into BbRepository so I can use Aa's methods? (both of those services are registered in config.neon services)

Basically I have to do exactly the same think like in presenters:

<?php
/** @var \Namespace\Class @inject */
public myRepository;
?>

or somehow get the service directly from DI container.

Thank you very much for your answers :)

Last edited by TonnyVlcek (2015-01-03 19:20)

newPOPE
Member | 648
+
+1
-

Hi,

“somehow get the service directly from DI container.” is not a good access.

And if you need AARepository in BBRepository just write a dependency in constructor and DI container build the service for you.

Example:

class BBRepository extends BaseRepository {

	public function __construct (AARepository $aaRepository) {
		// now you have AARepository here...
	}
}
TonnyVlcek
Member | 31
+
0
-

Ok, thank you, now I know where was the mistake.
I red that I should use constructor injection in model classes, but it always gave me a fatal error which was caused by my implementation.
Because of I'm extending from BaseRepository with its __construct method:

<?php
class BaseRepository extends Nette\Object
{
	function __construct($table, Context $context)
    	{
        	$this->context = $context;
        	$this->table = $table;
    	}
}
?>

I have to use this syntax inside of other model classes:

<?php
public function __construct($table, Nette\Database\Context $context, TeamsRepository $teamsRepository)
    {
        parent::__construct($table, $context);
        $this->teamsRepository = $teamsRepository;
    }
?>

Now it works how it is supposed to :)

I'm posting this for someone who maybe came across the same problem. Please, in case that this is not correct or best practice, let me know what I can do differently, thanks :)