CodeIgniter问题

时间:2010-01-25 19:42:41

标签: php codeigniter

我正在考虑将CodeIgniter用于新项目。我正在阅读CI的用户指南,我注意到了一些事情。在他们的所有示例中,他们似乎将所有逻辑放在Controller中,只是使用模型来获取和设置数据。我喜欢将我的所有逻辑都放在我的模型中。

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

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

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

如果您有任何其他提示可以帮助我学习这个新框架,我将不胜感激。

由于

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

刚看过Kohana,我想我会更多地了解这个

5 个答案:

答案 0 :(得分:3)

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

控制器应包含交互逻辑。

这意味着您的控制器应该根据用户的行为来说明应该使用哪些模型,视图,库等。

模型包含数据逻辑。

这可以是您的业务逻辑,税务计算,各种与数据相关的工作。用户指南中的示例建议仅使用Models作为“数据库的转储包装器”,但您可以对它们执行任何操作。模型简单表示您的数据,应用程序的其余部分不应该关注它的来源。

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

观看次数只是显示内容,因此不知道登录/注销状态。你当然需要从你的控制器(或MY_Controller等全球代码告诉它,恕我直言,几乎每个体面的应用程序都需要)。

存储为加密Cookie的会话非常安全。如果他们知道您的应用程序加密密钥,他们只能解码它们,但除非您没有设置密钥,否则这种可能性很小;在这种情况下,你只能责怪自己。

如果在cookies中存储会话不是您的一杯茶,您可以将会话值存储在数据库中以使其更加安全,或者抓住different session library进行操作。

CodeIgniter要记住的事情是它只建议工作方式,如果你不喜欢它,扩展,覆盖或替换。

答案 1 :(得分:2)

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

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

答案 2 :(得分:2)

  

他们似乎将所有逻辑放在Controller中,只是使用模型来获取和设置数据。

CodeIgniter在其模型中需要非常少的逻辑,而是为您提供一个非常愚蠢的SQL包装器,用于返回简单的POD类型数组来表示您的数据。它甚至将大量验证代码放入控制器中,这些(在我看来)是不正确和重复的。我已经为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

但AFAIK没有任何与CodeIgniter做类似事情的内置方法。

  

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

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

我相信CodeIgniter建议的方法:

<?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中

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

我倾向于说CodeIgniter唯一做得很好的是他们的文档,阅读更多关于session configuration及其active record的实现(实际上是一个与语言无关的SQL包装器,它无关使用Active Record模式)

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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