DI a Route::FILTER_OUT – PHP 5.2

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

Situace:

$frontRouter[] = new Route('event[/<id>]', array(
	'presenter' => 'Event',
	'action' => 'default',
	'id' => array(
		Route::VALUE => NULL,
		Route::FILTER_IN => 'EfilterIn',
		Route::FILTER_OUT => 'EfilterOut',
	),
));
function EfilterOut($id) {
	return RouterModel::filterOut($id);
};
class RouterModel extends BaseModel
{
	public static function filterOut($id)
	{
		$db = dibi::getConnection();
		$title = $db->fetchSingle('
			SELECT [event.title]
			FROM [event]
			WHERE [id] = %i', $id
		);

		return $id . '-' . String::webalize($title);
	}
}

…jak v rámci DI lze dostat DB connection k metodě filterOut?
Došla mi fantazie. V PHP 5.3 je to řešitelné přes closure, ale PHP 5.2? Jak tam dopravit service db, která aplikaci řeší připojení k DB pro všechny modely a injektuje se do BaseModelu? ModelLoader je DI container, který poskytuje modely jako služby…

	services:

		db:
			class: DibiConnection
			arguments: [%db%]

		model:
			class: ModelLoader
			arguments: [@container]
class ModelLoader extends DiContainer
{
	protected $context;

	public function __construct(DiContainer $contaier)
	{
		$this->context = $contaier;
	}

	public function createServiceHomepage()
	{
		return new HomepageModel($this->context->db, 'news');
	}
}

Editoval 22 (20. 10. 2011 7:39)

Filip Procházka
Moderator | 4668
+
0
-

Zjednodušeně takto:

$model = new MyModel($database);
$router[] = new Route('event[/<id>]', array(
        'presenter' => 'Event',
        'action' => 'default',
        'id' => array(
                Route::VALUE => NULL,
                Route::FILTER_IN => callback($model, 'filterIn'),
                Route::FILTER_OUT => callback($model, 'filterOut'),
        ),
));

Jak to zapsat pomocí DI Containeru budeš mít za domácí úkol :P :)

Editoval HosipLan (20. 10. 2011 8:03)

22
Člen | 1478
+
0
-

Ach jo, bych si nejradši nafackoval.. callback, callback, callback!

Díky mistře, to je samozřejmě jednoduché už potom.