代码之家  ›  专栏  ›  技术社区  ›  BDuelz

点火器问题

  •  0
  • BDuelz  · 技术社区  · 16 年前

    我正在考虑使用CodeIgniter进行一个新的项目。我在读《CI用户指南》,注意到一些事情。在他们所有的例子中,他们似乎把所有的逻辑放在控制器中,仅仅使用模型来获取和设置数据。我喜欢把我所有的逻辑放在我的模型中。

    它们的所有功能是否都适用于所有3个部分(模型、视图和控制器),或者如果试图在模型中执行逻辑而不是控制器,是否会出现问题。

    此外,所有三个部分(模型、视图和控制器)都可以访问所有变量。如果我想知道某个用户是否在该视图中登录,我是否需要从控制器将该信息传递给该视图,或者该视图中是否已经可以访问该信息?

    另外,我注意到会话数据存储在cookie中,即使它们是加密的。加密是否足够安全,可以使用,因为我更习惯于使用会话。另外,这些cookie默认存储多长时间?如果有人能弄清楚的话,我对那部分有点困惑。

    如果你还有其他的建议来帮助我学习这个新框架,我会很感激的。

    谢谢

    编辑: 我喜欢使用胖模型和瘦控制器,这样我可以在多个地方使用相同的功能。

    刚读过关于科哈纳的书,我想我会更深入地研究它的。

    5 回复  |  直到 15 年前
        1
  •  2
  •   user229044    16 年前

    他们似乎把所有的逻辑放在控制器中,只是使用模型来获取和设置数据。

    CodeIgniter在其模型中只需要很少的逻辑,相反,它为返回简单的pod类型数组来表示数据提供了一个非常愚蠢的SQL包装器。它甚至在控制器中放置了大量的验证代码,这(在我看来)是错误的和重复的。我已经在模型验证和动态查找方法中为Rails样式推出了自己的解决方案,允许

    // inside model: 
    // username must be 8 to 25 chars long
    $this->validates_length_of('username', 8, 25);
    
    // dynamically handled via __call()
    $this->User->find_first_by_username('john'); // Return object or null
    $this->User->find(); // select *
    $this->User->find_by_group('admin'); // return 0 or more records
    

    但是,阿法克没有任何内置的方式做类似的事情与代码点火器。

    此外,是否所有变量都可以访问所有3个部分?

    不需要;您必须手动将变量从控制器传递到视图中,并且不能与模型/控制器或模型/视图共享变量。

    我相信代码点火器建议的方法:

    <?php
    
    function users() {
      $data['users'] = $this->User->find(); 
    
      // must use $data['users'] for controller logic; verbose and annoying
    
      $this->load->view('users/index', $data); // $users defined for view
    }
    
    ?>
    

    可以通过使用php改进 compact 关键词:

    <?php
    
    function users() {
      $users  = $this->User->find(); 
    
      // now we can use $users more easily
    
      $this->load->view('users/index', compact('users'));
    }
    
    ?>
    

    我注意到会话数据存储在cookie中

    codeigner可以将会话数据存储在数据库中;请参见 $config['sess_use_database'] 在config/config.php中。其中还有其他与会话cookie的生存期相关的配置设置。

    我倾向于说,CodeIgniter唯一做得好的就是他们的文档,了解更多 session configuration 以及他们对 active record (实际上是与活动记录模式无关的语言独立的SQL包装器)

        2
  •  3
  •   Phil Sturgeon    16 年前

    你从一些不完全正确的基本例子中做出了许多假设。

    控制器 应该包含 相互作用 逻辑。

    这意味着您的控制器应该只根据用户正在做的工作来说明应该使用什么模型、视图、库等。

    模型 包含 数据 逻辑。

    这可以是您的业务逻辑、税务计算、各种与数据相关的工作。用户指南中的示例建议只使用模型作为“数据库的转储包装器”,但是您可以对它们做任何事情。模型simple代表您的数据,应用程序的其余部分不应该关心它来自何处。

    我的模型混合了XML文件解析、REST方法调用以及一些ActiveRecord查询。

    意见 只显示内容,因此不知道登录/注销状态。当然,您需要从控制器(或全局代码,如 MY_Controller 这几乎是每个合适的应用程序所需要的)。

    作为加密cookie存储的会话是完全安全的。只有当他们知道您的应用程序加密密钥时,他们才能对其进行解码,但除非您没有设置加密密钥,否则这是不太可能的;在这种情况下,您只能怪自己。

    如果将会话存储在cookies中不是您的茶,您可以将会话值存储在数据库中以使其更安全,或者 different session library 一起工作。

    使用CodeIgniter需要记住的是,它只建议了一些工作方法,如果您不喜欢它,可以扩展、覆盖或替换。

        3
  •  2
  •   Anthony Forloney    16 年前

    基于模型-视图-控制器的开发模式。模型代表您的数据结构,应该仅用于此目的。

    我会遵循这个惯例,特别是如果你想学习新的框架。

        4
  •  0
  •   stroncium    16 年前

    afaik,会话ID被加密并存储在cookie中,但是会话数据存储在本地数据库中。

    MVC的主要思想是这样的划分。但模型不仅限于直接访问数据,还可以执行各种数据操作。其思想是将存储在数据库中的对象(和对象集)表示为PHP对象,因此,如果在对象中具有某种功能似乎是合乎逻辑的,那么在模型中拥有它也是合乎逻辑的。

        5
  •  0
  •   Fer    16 年前

    我认为这里的误解是,这么多的Web应用程序除了一些简单的数据处理之外几乎没有任何逻辑,开发人员已经习惯了。

    推荐文章