【问题标题】:Refactoring controllers重构控制器
【发布时间】:2013-11-20 05:25:17
【问题描述】:

我对限制重复代码的控制器结构有一些疑问。

例如,我想检索男人和女人。最好的方法是什么:

class User {

   public function men() {
       //render
   }

   public function women() {
       //render
   }

   //OR

   public function by_type($type) {
       //render
   }

}

这是一个简单的例子,但类型的数量可以增加。并且每种类型都可以有单独的视图。我正在寻找未来的扩展解决方案。这种使用案例的最佳实践。

谢谢

【问题讨论】:

  • 创建单独的男性和女性过滤器/视图类,为每个类实现适当的逻辑,并将该过滤器/视图注入到您的用户类的by_type 方法中

标签: php architecture


【解决方案1】:

Rails 有一个称为fat model, skinny controller 的(somewhat controversial)原理,这基本上意味着您可以使用控制器来处理视图的逻辑,并让模型处理所谓的“繁重”


CakePHP / Rails

要从 CakePHP 移植到 Rails,我强烈建议尽可能多地使用模型,因为它允许您创建一个利用服务器的完整性能结构的应用程序,而不仅仅是将所有逻辑留在控制器,就像许多人使用 CakePHP 所做的一样

专门针对您的问题:

#app/controllers/users_controller.rb
def index
    @user = User.gender(params[:gender])
end

#app/models/user.rb
def self.gender(type)
    where?("type = ?", type)
end

这可以让您的控制器尽可能地精简,从而允许在整个应用程序中正确分布代码

我认为 Rails 与 CakePHP 有很大不同,因为它可以帮助您创建真正功能强大且内容丰富的应用程序,利用整个服务器,而不仅仅是提供一个层来使网站动态化

【讨论】:

    【解决方案2】:

    据我了解您的问题,您可以通过这种方式调用真正呈现 by_type 函数中的类型的函数:

    public function by_type($type) {
        if (method_exist($this, $type) {
            return call_user_func(array($this, $type));
        }
        else {
            throw new Exception('method do not exists!');
        }
    }
    

    这样你只需要编写渲染类型的方法并使用by_type方法调用它。

    【讨论】:

    • 我已经尝试过这种技术,但如果逻辑因类型而异,那就有点棘手了。方法的大小增长很快
    • 我想要一个干净且可扩展的控制器
    猜你喜欢
    • 1970-01-01
    • 2011-09-24
    • 1970-01-01
    • 1970-01-01
    • 2011-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多