http://hi.baidu.com/thinkinginlamp/blog/category/Zendframework
ZF控制器的htaccess文件怎么写
这里就写一个Apache的例子:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1 [QSA,L]
</IfModule>
设置类自动加载
在老版的ZendFramework里,可以像下面这样设置自动加载:
function __autoload($class)
{
Zend_Loader::loadClass($class);
}
新版的ZendFramework已经不能这么干了,而应该使用下面的方法:
Zend_Loader::registerAutoload();
顺便说点别的,通常设置类自动加载都是直接用__autoload,但一般这不是好习惯,因为我们的应用里可能会包含很多第三方类库,在这些类库里很有可能已经使用了__autoload,如果再使用__autoload必然会引起冲突。设置类自动加载更好的方法是使用spl_autoload_register
数据库表前缀
缺省情况下,Zend_Db_Table没有设置类似表前缀的方法。似乎说法是数据库本身的schema功能和表前缀功能重复。不过老实说,schema功能并不是所有的数据库都的,所以说表前缀功能还是需要的,但是只能自己编码实现了。
Zend_Db_Table_Row的若干个钩子方法
主要有_insert(),_postInsert(),_update(),_postUpdate(),_delete(),_postDelete(),利用钩子方法可以实现很多奇妙的功能,比如CakePHP中的Behavior功能就主要是利用钩子方法实现的。
Zend_Db_Table_Row中的对象属性
缺省情况下,表里有什么字段,Row对象就有什么属性,比如articles表有一个category_id字段,那么就有$article->category_id,如果你想使用骆驼样式($article->categoryId)的命名方式,可以通过重定义_transformColumn方法来实现。
部分功能缺失
现在的ZendFramework似乎还没有内建的UnitTest支持。此外,Ajax功能也没有。
Zend_Db_Table的find方法
Zend_Db_Table的find方法返回的是Zend_Db_Table_Rowset而不是Zend_Db_Table_Row。
如果想得到Row而不是Rowset,要这么调用的$table->find(123)->current();,这让人多少有些不舒服。
Zend_Db_Table中的表关系
当你利用Zend_Db_Table中的表关系去写代码的时候,很可能会写出类似下面的代码:
$accountsTable = new Accounts();
$accountsRowset = $accountsTable->find(1234);
$user1234 = $accountsRowset->current();
// 第一种方法
$bugsReportedByUser = $user1234->findDependentRowset('Bugs');
$bugsAssignedToUser = $user1234->findDependentRowset('Bugs', 'Engineer');
这样的代码可以说中规中矩,但是我推荐你还是使用类似下面的代码:
// 第二种方法
$bugsReportedByUser = $user1234->findBugs();
$bugsAssignedToUser = $user1234->findBugsByEngineer();
为什么这么说的?因为在第一种方法中,方法名findDependentRowset包含了Rowset字样,技术味道过重,而第二种方法中就没有这个问题,findBugs和findBugsByEngineer都是很有DSL感觉的好名字。
Zend_Controller中的Module功能
ZF的Module功能和CakePHP的Plugin作用类似,功能稍逊。大致有两种使用方法:
第一种:
$frontController->setControllerDirectory(array(
'default' => 'application/modules/default/controllers',
'article' => 'application/modules/article/controllers'
));
第二种:
$frontController->addModuleDirectory('application/modules');
当然,后一种方法更简单好用一些。
修改模板文件的扩展名
缺省状态下,模板文件的扩展名是phtml。如果你想修改它,很可能会落入ZF的陷阱,因为Zend_Controller_Action有一个viewSuffix属性,所以最先想到的修改方法很可能是:
$this->viewSuffix = 'tpl';
可惜你试试就会发现没有效果,正确的修改方法是这样的:
$this->_helper->viewRenderer->setViewSuffix('tpl');