我正在考虑将CodeIgniter用于新项目。我正在阅读CI的用户指南,我注意到了一些事情。在他们的所有示例中,他们似乎将所有逻辑放在Controller中,只是使用模型来获取和设置数据。我喜欢将我的所有逻辑都放在我的模型中。
它们的所有功能是否适用于所有3个部分(模型,视图和控制器),或者如果尝试在模型中执行逻辑而不是控制器,则会出现问题。
此外,所有3个部分(模型,视图和控制器)都可以访问所有变量。如果我想知道用户是否在视图中登录,我是否必须将该信息从控制器传递给视图,或者它是否已在视图中访问?
另外,我注意到会话数据存储在cookie中,即使它们是加密的。加密是否足够安全,因为我更习惯使用会话。此外,这些cookie默认存储多长时间?如果有人能清楚的话,我对那部分感到有点困惑。
如果您有任何其他提示可以帮助我学习这个新框架,我将不胜感激。
由于
编辑:我喜欢使用Fat Models和瘦控制器,这样我就可以在多个地方使用相同的功能。
刚看过Kohana,我想我会更多地了解这个
答案 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应用程序在一些简单的数据处理之外几乎没有任何逻辑,开发人员已经习惯了它。