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
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
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)