如果您是PHP开发人员,那么在选择您的编程语言时就可以很快找到一个深刻的发现:大型项目可能会变得混乱。
这并不是PHP的错。 是的,该语言功能丰富,并且具有足够的惯用弹性来区分一个程序员的工作与另一个程序员的工作。 在这方面,PHP与Perl相似,这是某些人喜欢它(而其他人则鄙视它)的原因之一。 任何审阅了旧PHP项目的经验丰富PHP开发人员都可以轻松地在项目的各个阶段检测不同开发人员的工作-就像您是一位考古学家一样,正在深入了解地下室并目睹了不同文化在各自时代的前进。
无论涉及的样式或使用的方法如何,超过数千行PHP项目都趋于匆忙。 这主要是因为它们的结构不统一。 一些程序员创建类来组织他们的工作,但是似乎没有两个程序员对如何编写类有相同的想法。 其他程序员构建大量包含功能的包含文件。 还有一些人使用诸如PEAR之类的庞大的整体库。
MVC框架如何提供帮助
直到几年前,PHP仍缺乏良好的功能性Model-View-Controller(MVC)框架。 MVC框架允许程序员将代码组织到三个不同的功能区域中:
- 模型包含与数据库和其他数据结构相关的所有代码。 如果您有一个名为pages的表,那么您将拥有一个模型以及该模型中的函数,用于从该表中选择,创建,更新和删除记录,等等。
- 视图包含您所有的显示和UI元素-您JavaScript代码,级联样式表(CSS),HTML甚至PHP。
- 控制器将它们放在一起。 控制器中的每个功能代表一个目的地或路线。 如果您有一个名为/ about的目的地,则您的控制器将具有一个名为
about()
的函数。
如果您以前没有使用过MVC框架,那么这三个要点几乎不能提供有关此组织计划背后的强大力量的任何线索。 一旦开始考虑MVC,您对PHP开发的看法和态度就会发生根本变化。
例如,您无需将数据库查询代码放入项目的每个可用角点中,而是将其全部组织到模型中。 要从数据库表中选择页面,请使用页面模型中的函数。
同样,如果您需要更新特定页面的外观,则可以使用视图。 您不会弄乱控制器。 同样,在控制器中,您可以为应用程序添加目标和其他控制代码。 您不会在模型中放入任何东西。
在使用任何MVC框架的一天之内,您将意识到自己的系统易于记忆并根据需要进行扩展。 如果客户下周需要更改,则没问题-您可以处理。 如果明年提出要求,情况也是如此。
配置约定惯例
在所有MVC框架中,最著名的是Ruby on Rails。 几年前,它席卷了Web开发的海滩,并吸引了所有人的想象力。 它不仅是一个MVC框架,而且是一个配置约定之上的MVC框架。
约定优于配置意味着使用Rails,您可以设置一些关键的配置项(例如,数据库的位置,某些用户名和路径),而其余的则通过智能默认值来处理,您以后可能会不必调整。
结果不仅是井井有条的代码,而且是一个令人难以置信的快速且易于使用的Web开发环境。 PHP世界中的人们对如此酷炫和奇妙的东西充满了期待。 在接下来的一两年中,出现了许多类似Rails的工具:CakePHP,Symfony和许多其他工具。
输入CodeIgniter
最后,EllisLab的好伙伴发布了CodeIgniter。 在使用并尝试了所有可用PHP MVC框架之后,CodeIgniter在许多公司中脱颖而出,主要是因为它在组织动态范围内仅支持足够的自由度以允许开发人员快速工作。
自由意味着使用CodeIgniter,您不必以某种方式命名数据库表,也不必以表名命名模型。 这使CodeIgniter成为重构遗留PHP应用程序的理想选择,在该应用程序中您可能需要移植各种疯狂的结构。
CodeIgniter不需要大量的代码(1.6.2版本是纤细的2.8 MB,其中1.3 MB是可以删除的用户文档),也不要求您插入PEAR之类的大型库。 它在PHP 4或PHP 5中同样有效,使您可以创建相当可移植的应用程序。 最后,您不必使用模板引擎来创建视图,只是老式HTML和PHP即可。
但是,只要有了介绍性的材料,就可以构建一个简单的项目,并了解将您带到何处。
安装和配置CodeIgniter
任何新的CodeIgniter项目的第一步都是下载最新的软件包(在撰写本文时为1.6.2;请参阅“ 相关主题”部分)。 下载压缩的(.zip)存档并解压缩后,您将拥有一个codeigniter_ <version_number>文件夹,其中包含入门所需的所有内容。
在开始进行最少的配置更改集之前,本节将快速浏览CodeIgniter,以便您熟悉这片土地。
文件夹结构
当打开CodeIgniter文件夹时,您会注意到一个名为system的文件夹。 这是您所有CodeIgniter代码所在的位置。 该文件夹中还有许多其他文件夹,其中一个称为应用程序:您将使用的文件的99.999%位于此文件夹中。 该文件夹之所以得名,是因为它包含您的应用程序以及其中的所有内容-系统文件夹的其余部分包含CodeIgniter核心代码,库以及您不应该使用的其他文件。
应用程序文件夹分为多个其他文件夹(请参见图1 )。 其中大多数很容易弄清楚。 您的模型进入模型文件夹,视图进入视图,控制器进入控制器,依此类推。 您还具有用于存储CodeIgniter帮助程序和库的本地扩展的文件夹,本文不会对此进行讨论。
图1. CodeIgniter的文件夹结构
目前,system / application文件夹中最重要的文件夹是config。 该文件夹中有两个需要立即注意的文件:config.php和database.php。
config.php文件包含用于设置CodeIgniter的基本参数和参数。 database.php文件包含用于连接到数据库的基本参数和参数。
目前,您在config.php文件中唯一要做的就是设置base_url
参数,该参数可能设置为http://127.0.0.1/CodeIgniter/。 更改它以匹配您正在使用的服务器的地址:
$config['base_url'] = "http://www.example.com/";
即使在子目录中设置CodeIgniter应用程序,也始终添加斜杠。
接下来,打开database.php文件,并设置数据库服务器的连接参数:
$db['default']['hostname'] = "your-db-host";
$db['default']['username'] = "your-username";
$db['default']['password'] = "your-password";
$db['default']['database'] = "your-db-name";
$db['default']['dbdriver'] = "mysql";
而已。 您可以做其他事情(例如设置自动加载首选项和特殊路由),但是只要CodeIgniter知道它在哪里并且可以连接到其基础数据库,就可以自由地开始编码。
您的第一个CodeIgniter项目
既然已经安装并配置了CodeIgniter,就可以构建一个项目。 最多需要一个小时的时间。
无需构建Hello World应用程序,而是使用CodeIgniter创建一个简单的网站。 它将有一个主页,其中显示一些促销副本以及一个张贴到数据库表的表格。 无需担心外观和感觉,只需专注于从应用程序角度出发有意义的部分。 换句话说,让美学家为事物的外观担心—您只需确保它工作正确并快速完成即可。
用CodeIgniter术语,这些要求可以转换为以下内容:
- 一个仅包含少数功能的控制器(您可以使用默认的Welcome控制器)
- 一种用于存储联系信息的模型(以及数据库表)
- 一个主视图和一些支持包括
创建数据库表和模型
从模型开始,可以帮助您在开始分层功能和UI之前理解基础数据库表。 如果您对表格的内容一无所知,则很难设计与表格进行对话的表单。
对于示例应用程序,您要存储表单中的联系信息。 那么,您要询问什么样的联系信息? 现在,请遵循基本要求,并要求提供名称,电子邮件地址,电话号码和简短注释。 您可能还希望在后端存储时间戳和IP地址。
MySQL表如下所示:
CREATE TABLE `contacts` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(128) NOT NULL,
`email` varchar(255) NOT NULL,
`notes` text NOT NULL,
`stamp` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
`ipaddress` varchar(32) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM;
既然表格已经准备就绪,现在该创建您的第一个模型了。 在system / application / models文件夹中,创建一个名为mcontacts.php的文件。 为什么要联系? 这是一种简写形式-在文件名中的模型名称前加上m可以帮助您使事情井井有条,而不必使用更长的前缀或后缀(例如model_) 。
所有模型的结构均相同:
class MContacts extends Model{
function MContacts(){
parent::Model();
}
}
请注意,类名与文件名匹配,并且您必须具有用于类的构造函数。 换句话说,模型是PHP类。 这意味着模型中的每个函数都只是该类的一个方法。
一旦弄清了这一点,就可以断定需要一个可以将数据安全地插入联系人数据库表中的功能,这并非遥不可及。 这是一个执行此操作的函数:
function addContact(){
$now = date("Y-m-d H:i:s");
$data = array(
'name' => $this->input->xss_clean($this->input->post('name')),
'email' => $this->input->xss_clean($this->input->post('email')),
'notes' => $this->input->xss_clean($this->input->post('notes')),
'ipaddress' => $this->input->ip_address(),
'stamp' => $now
);
$this->db->insert('contacts', $data);
}
重要的是要注意,您是从POST
数组中获取输入,清理它,然后将其存储到名为contacts的数据库表中。 在此过程中,您正在使用各种助手来简化您的任务。
例如, $this->input->xss_clean()
使表单字段中的数据不受影响, $this->input->post()
简化对这些表单字段的访问, $this->input->ip_address()
获取IP用户浏览器的地址,然后$this->db->insert()
将新记录添加到数据库表中。
在这种情况下,使用$this->input->xss_clean()
非常重要-您正在处理Web上的用户输入,可以是任何东西。 使用xss_clean()
函数可能是您应该做的最少的事情,因为您可能会更加谨慎。 可能需要按顺序添加将输入字段的长度缩短到特定大小的功能。 不过,到目前为止, xss_clean()
例程可以使您足够安全。
在短短几分钟内,您就创建了一个可重用的功能,该功能可让您将联系信息存储在数据库中。 现在,您将继续使用控制器。
初始化控制器
在CodeIgniter中,控制器是您组织项目的地方。 将每个功能都视为站点或应用程序中的另一个页面或目标。 如果您有主页,则需要一个index()
函数。 如果有“关于我们”页面,则需要一个about()
或about_us()
函数-这取决于您要如何构造URL。
您甚至可以将控制器组织到文件夹中以创建分层结构。 例如,在system / application / controllers文件夹中,可能有一个名为admin的文件夹,并且在其中有admin工具的每个主要部分的各种控制器。 您可以按以下方式访问这些控制器(和功能):http://www.example.com/admin/controller-name/function-name/。
现在,使用默认控制器(称为“欢迎”)。 它以welcome.php的形式存储在system / application / controllers /文件夹中。 打开它时,应该看到以下内容:
class Welcome extends Controller {
function Welcome(){
parent::Controller();
}
function index(){
$this->load->view('welcome_message');
}
}
如您所见,类的名称反映了文件的名称。 还有一个构造函数,它在CodeIgniter内核的深处调用父Controller
类。 到目前为止,一切都很好。
接下来,请注意名为index()
的启动程序函数,该函数将加载一个名为welcome_message的视图。 在删除该函数并编写自己的函数之前,请务必注意,此原型index()
函数几乎可以完成向应用程序的最终用户显示信息所需的最低要求。
让我们继续构建一个新的index()
函数。 您需要做的第一件事是加载有价值的Form Helper,它可以帮助您完成创建联系表单的繁琐任务。
接下来,设置许多可在视图内使用的变量-这样,您可以使应用程序更好地组织。 例如,您可能想在控制器中设置标题和标题。 如果这样做,则必须将变量加载到视图中。 加载的变量之一是包含的视图的名称。 这样,您就可以设置一个主视图,该主视图包含您的所有外观和感觉以及包含您的内容的各种内容:
function index(){
$this->load->helper('form');
$data['title'] = "Welcome to our Site";
$data['headline'] = "Welcome!";
$data['include'] = 'home';
$this->load->vars($data);
$this->load->view('template');
}
$data
数组将传递到称为模板的视图(在下一步中创建)。 可以使用键名访问该数组中的信息,因此,如果要打印标题,可以使用$headline
访问。
接下来,创建模板和主视图(后者只是一个include),然后完成控制器。
创建视图
您的第一个视图非常简单-这就是所谓的模板。 我们将简化显示灵活视图的过程。 模板视图以template.php的形式存储在system / application / views中,最初看起来像这样:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title></title>
</head>
<body>
</body>
</html>
但是请记住,您要传入三个变量: $title
, $headline
和$include
的名称。 再次是模板视图,其中的粗体显示为:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title><?php echo $title;?></title>
<style>label { display:block;}</style>
</head>
<body>
<h1><?php echo $headline;?></h1>
<?php $this->load->view($include);?>
</body>
</html>
在前两个添加中,您分别回显了在$data['title']
和$data['headline']
找到的$data['title']
。 然后,使用$data['include']
的值加载第二个视图。 在这种情况下,这是一个称为家庭的视图。 (还请注意,您稍后添加了一些CSS来简化其他操作。)
如果要调用它,最好构建它。 这是一个简单的视图,其中包含一段文本和一个表单,用于从您的网站访问者那里收集信息:
<p>This is random text for the CodeIgniter article.
There's nothing to see here folks, just move along!</p>
<h2>Contact Us</h2>
<?php
echo form_open('welcome/contactus');
echo form_label('your name','name');
$ndata = array('name' => 'name', 'id' => 'id', 'size' => '25');
echo form_input($ndata);
echo form_label('your email','email');
$edata = array('name' => 'email', 'id' => 'email', 'size' => '25');
echo form_input($edata);
echo form_label('how can you help you?','notes');
$cdata = array('name' => 'notes', 'id' => 'notes', 'cols' => '40', 'rows' => '5');
echo form_textarea($cdata);
echo form_submit('submit','send us a note');
echo form_close();
?>
图2显示了将所有内容加载到浏览器后的样子。
图2:带有表单的简单视图
再一次,您将使用一组有价值的CodeIgniter快捷方式。 这次,您使用在控制器中加载的Form Helper。 form_open()
函数使您可以打开表单-它具有一个必需的参数,即表单发布到的目的地。 一分钟后,您将回到控制器并添加一个contact()
函数来处理表单发布数据。
在整个表单中,您使用form_label()
创建可访问性标签,使用form_input()
和form_textarea()
构建表单字段和文本区域,并使用form_submit()
构建输入按钮。 请注意,使用form_input()
和form_textarea()
(以及许多其他表单函数),您可以传入一系列信息,以帮助您跟踪字段名称,id,大小和其他信息。
最后,使用form_close()
关闭表单。
让我们返回并完成控制器。
完成申请
现在已经有了两个视图,您需要返回到控制器并添加另外两个功能。 您已经知道第一个:它是contactus()
函数,用于处理主页上来自表单的传入POST。 第二个是thankyou()
函数,用作表单的最终确认页面。
contactus()
函数很简单。 加载MContacts模型,在该模型中运行addContact()
函数,然后将用户重定向到“谢谢”页面。 注意,要使用redirect()
函数,必须加载URL Helper。
这是代码:
function contactus(){
$this->load->helper('url');
$this->load->model('MContacts','',TRUE);
$this->MContacts->addContact();
redirect('welcome/thankyou','refresh');
}
这是Thankyou()函数:
function thankyou(){
$data['title'] = "Thank You!";
$data['headline'] = "Thanks!";
$data['include'] = 'thanks';
$this->load->vars($data);
$this->load->view('template');
}
而且,很容易,这是感谢视图:
<p>Thanks so much for contacting us. Someone will be in contact with you soon.</p>
您可能想知道为什么要浪费这么小的视野。 为什么不在控制器中设置变量并以这种方式运行它? 您可以这样做,但是始终最好将功能组件分开。 这样,您就不会冒任何麻烦的风险。
增加安全性
您还应该做一件事。 在Welcome控制器的contactus()
函数中,您冒着在数据库中创建多个空白记录的风险–所要做的就是连续将联系人目标加载到其浏览器或通过某种bot进行操作的人。
要避免这种情况发生,最简单的方法就是在控制器中添加一个简单的测试。 如果有POST
数据,请加载模型和功能。 如果不是,请将其发送回首页。 这是重写的函数:
function contactus(){
$this->load->helper('url');
if ($this->input->post('email')){
$this->load->model('MContacts','',TRUE);
$this->MContacts->addContact();
redirect('welcome/thankyou','refresh');
}else{
redirect('welcome/index','refresh');
}
}
结论
在不到一个小时的时间内,您就安装了CodeIgniter,对其进行了配置,并创建了一个由主页,将信息添加到数据库的表单和感谢页面组成的网站。
当然,还有更多的东西要学习。 例如,您可以自动加载模型以及所需的任何帮助程序或库。 您可以对应用程序进行缓存和性能调整。 您可以在视图中添加更多CSS好东西。 您可以在数据库插入的末尾添加电子邮件通知。
现在,您几乎了解了开始使用CodeIgniter所需的一切。
翻译自: https://www.ibm.com/developerworks/web/library/wa-codeigniter/index.html