何处放置可供控制器和模型访问的可重用代码

use*_*535 6 zend-framework

我在Zend项目中有一些与货币转换相关的功能.我想利用Controllers和Models中的功能.是否有最佳实践可以放置此代码?或者事实上,两者中使用的功能都是一个指标,也许我应该重新考虑项目的结构,所以在两个地方都不需要它?

Jam*_*esG 6

我认为纯粹主义者会争辩说,如果你在控制器代码中进行货币转换,那么你可能做错了,因为那里不应该有任何业务逻辑.然而,有时候实际考虑会超过纯粹主义者的担忧.我们假设这是一个这样的情况.:-)

如果您的货币类是一个相当简单的实用程序类型,那么我倾向于在"application"下创建一个名为"utils"的新目录,然后将该目录添加到应用程序引导程序中的资源加载器:

protected function _initResourceLoader()
{
    $this->_resourceLoader->addResourceType( 'utility', 'utils', 'Utility' );
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以创建一个名为Application_Utility_Currency存储在该目录中命名的文件Currency.php中的类,并调用静态方法,例如:

Application_Utilility_Currency::convert( $from_currency, $to_currency, $amount );
Run Code Online (Sandbox Code Playgroud)

如果你有其他的实用程序类也在寻找一个家,这种方法将特别有用.

但是,如果您的货币类包含更丰富的功能(例如连接到外部服务以获取汇率数据等),那么IMO最好将其视为"服务"而不是"实用程序".我对"模型"的定义相当松散,包括所有与数据相关的服务,无论数据是位于应用程序数据库还是其他地方,所以如果类是更复杂的类,那么我只是将它与其他楷模.