Bookmark and Share

Lee's 程序人生

HTML CSS Javascript XML AJAX ATLAS C# C++ 数据结构 软件工程 设计模式 asp.net Java 数字图象处理 Sql 数据库
  博客园  :: 首页  :: 新随笔  :: 联系 :: 管理

ZF部分技巧

Posted on 2008-06-13 10:28  analyzer  阅读(413)  评论(0编辑  收藏  举报

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

我要啦免费统计