Salve,
vorrei qualche consiglio sulla corretta implementazione di due aspetti:
1° (più PHP che ZF) Le classi "contenitori" di metodi che effettuano le varie operazioni con i model (find, save etc), in che modo si implementano più correttamente?
Io ho dichiarato tutto static tipo:
codice:
class Application_Model_PagesMapper
{
protected static $_dbTable;
private static function setDbTable($dbTable)
{
if (is_string($dbTable)) {
$dbTable = new $dbTable();
}
if (!$dbTable instanceof Zend_Db_Table_Abstract) {
throw new Exception('Invalid table data gateway provided');
}
self::$_dbTable = $dbTable;
}
private static function getDbTable()
{
if (null === self::$_dbTable) {
self::setDbTable('Application_Model_DbTable_Pages');
}
return self::$_dbTable;
}
public static function save(Application_Model_Page $page)
{
$data = array(
'id' => $page->getId(),
'author_id' => $page->getAuthorId(),
'create_date' => $page->getCreateDate(),
'name' => $page->getName(),
'content' => $page->getContent(),
'is_home' => $page->isHome(),
);
if (null === ($id = $page->getId())) {
unset($data['id']);
self::getDbTable()->insert($data);
} else {
self::getDbTable()->update($data, array('id = ?' => $id));
}
}
public static function find($id)
{
$result = self::getDbTable()->find($id);
if (0 == count($result)) {
return null;
}
$page = new Application_Model_Page();
$row = $result->current();
$page->setId($row->id)
->setAuthorId($row->author_id)
->setCreateDate($row->create_date)
->setName($row->name)
->setContent($row->content)
->isHome($row->is_home);
return $page;
}
}
vi sono modi più corretti? tipo il singleton?
2° Devo implementare un sistema di visualizzazione di pagine html statiche salvate su db raggiungibili via "alias" diretto. Ho creato un controller "page" con la action "show" che passandogli l'id della pagina sul db me la porta in view, poi ho registrato il seguente plug-in per reindirizzare le richieste che non hanno controller ("!$front->getDispatcher()->isDispatchable($request)") al controller "page/show/id/n" nel caso esista una pagina con quell'alias:
codice:
class My_Route extends Zend_Controller_Plugin_Abstract
{
public function preDispatch(Zend_Controller_Request_Abstract $request)
{
$front = Zend_Controller_Front::getInstance();
if( !$front->getDispatcher()->isDispatchable($request) )
{
$path = ltrim($request->getPathInfo(), '/');
$page = Application_Model_PagesMapper::findByAlias($path);
if (null != $page)
{
$request->setControllerName('page')
->setActionName('show')
->setParam('id', $page->getId());
}
}
}
}
il tutto a funzionare funziona, ma vorrei consigli su come e se si può far di meglio (ho cominciato da poco ad usare ZF).
Grazie in anticipo