我知道所有逻辑等都应该放在控制器中,但我有一个SQL语句,其中某些部分由另一个函数的返回值决定。
在我的模特中:
$cols = 'products.id, name, currencies.symbol, basePrice';
$m = new AuthController();
if($m->moduleExists('Sales'))
{
$cols .= 'lastSold';
}
或者在我的控制器中将SQL作为参数传递给模型?
$cols = 'products.id, name, currencies.symbol, basePrice';
if($this->moduleExists('Sales'))
{
$cols .= 'lastSold';
}
答案 0 :(得分:1)
<强> tldr;版本强>
考虑到关注点和分离的分离,与持久性最佳相关的代码不应包含与特定系统的子模块相关的业务逻辑(该逻辑是否属于模型部分的控制器,MVC,或者控制器部分,或程序员引入系统的任何其他部分)。应该避免从持久层到业务逻辑的访问以维持解耦,而应该优先考虑访问持久层的业务逻辑的另一种方式。
<强>理由强>
在您的模型中,您应该放置与您的视图中显示的内容无关的代码,即模块是否存在,或者是否授权拥有此类模块。您的模型中的代码应该可以由子系统,其他系统,与您的视图无关的任何内容或甚至与特定用例相关的业务逻辑使用。它应该具有与系统范围相关的逻辑。虽然授权似乎具有系统范围,但应特别小心处理,因为它可能导致设计脆弱。在控制器级别使用它更灵活。想象一下,试图支持多种授权技术。
根据授权或视图标准修改查询将无法维护稳定的独立模型。
所以是的,它应该进入你的控制器。
控制器是否是与视图或特定业务逻辑相关的控制器(与用例相关或与系统相关,即授权控制器)现在可以具有更改查询的授权标准,并且将来可能会出现一些其他标准与特定用例或子系统域有关。这意味着控制器可以更改,您甚至可以使用特定方式引入访问相同模型的不同控制器。
<强>实施强>
有很多方法可以解决您的问题。如,