以下是 Roma Azarov 的客座文章。我能够轻松地按照步骤操作,并在几分钟内在我的机器上运行演示应用程序。快速构建强大的 Web 应用程序变得如此简单,这真是太棒了。
CakePHP 是一个免费的、开源的、用于 PHP 的快速开发框架。它是程序员创建 Web 应用程序的基础结构,使您能够以结构化和快速的方式工作,而不会损失灵活性。在本教程中,我们将探讨使用 CakePHP 的好处,并提供一个示例项目,一个事件管理器风格的应用程序,以帮助您入门。
CakePHP 消除了 Web 开发的单调性。我们为您提供开始编写真正需要完成的代码所需的所有工具:特定于您的应用程序的逻辑。无需每次开始新项目时都重新发明轮子,请查看 CakePHP 的副本,并开始使用应用程序的真正核心。CakePHP 拥有一个活跃的开发团队和社区,为该项目带来了巨大的价值。除了避免重新发明轮子之外,使用 CakePHP 还意味着您的应用程序的核心经过了充分测试,并且正在不断改进。
以下是在使用 CakePHP 时您将享受的一些功能列表
- 活跃友好的社区
- 灵活的许可
- 兼容 PHP 4 和 5 版本
- 集成的 CRUD 用于数据库交互
- 应用程序脚手架
- 代码生成
- MVC(模型、视图、控制器)架构
- 请求分派器,具有简洁的自定义 URL 和路由
- 内置验证
- 快速灵活的模板(PHP 语法,带助手)
- 用于 AJAX、JavaScript、HTML 表单等的视图助手
- 电子邮件、Cookie、安全、会话和请求处理组件
- 灵活的 ACL(访问控制列表)
- 数据清理
- 灵活的缓存
- 本地化
- 可以从任何网站目录运行,几乎不需要 Apache 配置。
构思
本教程的主要思想是使用 CakePHP 创建一个简单的事件管理器。我们的项目将
- 创建/更新/删除事件,无论是否附加位置(这通常称为 CRUD 风格的应用程序)
- 创建/更新/删除位置
- 以**列表**视图或**日历**视图显示所有事件
- 为所有事件提供 RSS Feed
我们的项目还包括以下高级技术概念
- 使用第三方组件(Swift Mailer)
- AJAX 功能(jQuery + CakePHP)
- 自定义助手
- 自定义用户访问控制(基于用户角色)
- 创建后端
以下是运行此项目所需的条件
- 启用了 mod_rewrite 的 Apache Web 服务器
- PHP 5 或更高版本
- MySQL
- SVN 客户端
项目安装
如果您希望在本地工作,使用 MAMP/LAMP/WAMP 等工具是一个不错的选择。您可以创建一个本地开发域名并在那里工作。
无论您选择在哪里工作,请在服务器的根目录中创建一个文件夹。您可能正在使用 MAMP/WAMP/LAMP 等工具在本地工作,或者正在在线开发服务器上工作。您可以根据需要命名它。使用您的 shell 访问权限导航到此文件夹并运行以下命令
svn checkout http://cakephp-tricks.googlecode.com/svn/trunk/ cakephp-tricks-read-only
创建数据库和 SQL 结构
现在您需要在 MySQL 中创建一个新数据库。可以通过您的 Web 主机提供的任何方式进行操作,或者在本地使用 Sequel Pro 等工具。
您可以根据需要为其命名并设置密码。然后,您需要运行此 SQL 来设置结构
CREATE DATABASE `tricks_cake`;
USE `tricks_cake`;
/* Table structure for table `events` */
DROP TABLE IF EXISTS `events`;
CREATE TABLE `events` (
`id` int(10) unsigned NOT NULL auto_increment,
`user_id` int(10) unsigned default NULL,
`location_id` int(10) unsigned default NULL,
`exp_date` datetime default NULL,
`title` varchar(255) default '',
`description` text,
`url` varchar(255) default '',
`complete` enum('yes','no') default 'no',
`created` datetime default NULL,
`modified` datetime default NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
/* Table structure for table `locations` */
DROP TABLE IF EXISTS `locations`;
CREATE TABLE `locations` (
`id` int(10) unsigned NOT NULL auto_increment,
`user_id` int(10) unsigned default NULL,
`title` varchar(255) default '',
`city` varchar(50) default '',
`state` varchar(2) default '',
`zip` int(10) unsigned default NULL,
`address1` varchar(255) default '',
`address2` varchar(255) default '',
`created` datetime default NULL,
`modified` datetime default NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
/* Table structure for table `users` */
DROP TABLE IF EXISTS `users`;
CREATE TABLE `users` (
`id` int(10) unsigned NOT NULL auto_increment,
`email` varchar(50) default '',
`pass` varchar(50) default '',
`enabled` enum('yes','no') default 'yes',
`activated` enum('yes','no') default 'no',
`ac_code` varchar(32) default '',
`role` enum('admin','user') default 'user',
`created` datetime default NULL,
`modified` datetime default NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
此 SQL 也位于项目中的 /app/config/schema/structure.sql 中。
设置项目文件
现在我们已经安装了 CakePHP 项目并使用服务器环境进行了设置,让我们看一下代码。我们需要对配置文件进行一些更改。
core.php
这是主要的配置文件。您需要将默认配置文件(位于 /app/config/core.php.default)重命名或复制为 core.php,并放在同一文件夹中。接下来,您需要更改一些自定义设置。
以下几行需要在该文件中已有的代码中进行调整,并帮助我们从应用程序发送电子邮件(需要用于发送新用户确认电子邮件)
// SMTP
Configure::write( 'smtp_type', 'tls' );
Configure::write( 'smtp_timeout', 60 );
Configure::write( 'smtp_host', 'smtp.gmail.com' );
Configure::write( 'smtp_port', 465 );
Configure::write( 'smtp_user', '[email protected]' );
Configure::write( 'smtp_password', '' );
Configure::write( 'smtp_encryption', 'ENC_SSL' );
Configure::write( 'smtp_mail_from_name', 'noreply' );
Configure::write( 'smtp_mail_from_addr', '[email protected]' );
以上值用于我们专门为此创建的测试/垃圾 Gmail 帐户。如果您计划从自己的 Google 帐户发送电子邮件,则需要更改 3 个变量:smtp_user
、smtp_password
和 smtp_mail_from_addr
现在将项目的 site_name
更改为其所在的 URL
// globals
Configure::write( 'site_name', 'learning-cakephp.dev' );
在扩展项目时,您可能希望更改其他值,但现在您无需执行此操作。您可以阅读更多关于 CakePHP core.php 配置变量的信息。
database.php
这是数据库配置文件。您需要将此文件(位于 /app/config/database.php.default)重命名或复制为 database.php,并放在同一目录中。然后填写 $default 连接数组。完成的配置应如下所示
var $default = array('driver' => 'mysql',
'persistent' => false,
'host' => 'localhost',
'login' => 'cakephpuser',
'password' => 'c4k3roxx!',
'database' => 'my_cakephp_project',
'prefix' => '');
这些是创建项目数据库时的数据库连接详细信息。有关 数据库配置 的更多信息。
routes.php
路由是一项将 URL 映射到控制器操作的功能。它被添加到 CakePHP 中以使漂亮的 URL 更易于配置和灵活。使用 Apache 的 mod_rewrite 不是使用路由的必要条件,但它会使您的地址栏看起来更整洁。目前您无需更改此文件,但您可以阅读有关此文件(以备将来使用)的信息 此处。
app_controller.php
此文件(位于 /app/app_controller.php)是项目中所有控制器的父类。如果此文件存在,所有 Controller 类都将继承自我们的 app_controller。如果它不存在,它们将继承自库中的默认文件 /cake/libs/controller/app_controller.php。如果我们需要扩展所有控制器,这将非常有用。您可以阅读更多关于 App Controller 信息。
app_model.php
本文件(位于 /app/app_model.php)是项目中所有模型的父类。它的作用类似于 app_controller,但适用于所有模型。如果您查看任何模型代码 (/app/models),您会发现我们使用 $validationSet 属性(而不是原始的 $validate 属性)来创建验证方案列表,这允许更灵活地将验证数据存储在数据库中。此外,我们使用 app_model 来编写自定义验证规则,以便在所有模型中使用。
address.php
此文件(位于 /app/views/helpers/address.php)演示了如何为您的项目创建自定义助手。您可以阅读 此处关于助手的更多信息。
第三方库
我们使用第三方库 SwiftMailer 发送电子邮件,而不是内置的 EmailComponent,以演示 CakePHP 如何与第三方库协同工作。SwiftMailerComponent(位于 /app/controllers/components/swift_mailer.php)用于从我们的 CakePHP 项目访问 SwiftMailer 库。您可以阅读 此处关于组件的更多信息。
附加结构
最后,关于代码结构的几点说明。CakePHP 具有 Controller、Model 和 View 类,但它还具有一些其他类和对象,使 MVC 开发更加快捷和愉悦。组件、行为和助手是提供可扩展性和可重用性的类,可以快速地向应用程序中的基本 MVC 类添加功能。目前,我们将保持较高的层次,因此以后再详细了解如何使用这些工具。您可以阅读更多关于 类的信息 和更多关于 CakePHP 约定 的信息。
访问管理区域
- 至少注册一个用户(你自己)。
- 在您的数据库中,找到您在“users”表中的记录。
- 将您用户的“role”字段值更改为“admin”,而不是“user”。
- 登录,您现在将在导航栏中看到“backend”链接。
继续!
现在您可以开始研究我们的教程项目了!在浏览器中访问您的开发域名应该会显示应用程序。您将能够注册帐户、激活它,然后创建/更新/删除事件和位置,以及在两种不同的视图中查看它们。
可写错误?
如果您收到关于缓存文件不可写的错误,请确保 /app/tmp 文件夹是可写的,然后将这些权限应用于所有子文件夹。
酷!我期待着未来的帖子。我对 PHP 框架很感兴趣,但是(我很抱歉在评论的早期就提出这个问题)与 Rails 相比,它们似乎都需要大量的代码来完成简单的事情。
尽管如此,我的公司主要有 PHP 程序员,而且我们目前没有使用任何框架。因此,这个系列将让我深入了解 Cake!
可能是因为它基于面向对象,这自然需要更多代码(当然,它在重用模块等方面似乎好得多)。
只有当你只使用一次代码时,它才需要更多代码。如果你多次使用它(或者如果有几个不同的流程可能包含或不包含该代码块),那么它可以节省大量工作。
根据您的经验,CakePHP 会带来哪些限制?您是否也使用过其他 PHP 框架?我假设您最喜欢 Cake,否则您不会写关于它的文章 :)
我认为向设计师/图形人员教授这些东西通常不是一个好主意。
原因有两个。
首先,人们通常倾向于某一种方式。也就是说,他们在图形设计方面很出色,并且发现正确的编码/编程(超出 CSS、HTML 和可能 JavaScript)令人困惑,或者他们在编程方面很出色,但除了 CSS 之外,无法使任何东西看起来漂亮。
其次,从框架中进行教学是一个糟糕的主意。
为什么?因为您教授的是框架,而不是语言。通过学习框架,您简化了事情,这意味着如果学习者遇到问题,他们将无法编写代码来解决它,他们将无法完全理解他们在做什么,并且他们将依赖于该框架。虽然他们可以去学习另一个框架,但他们将从头开始,并且在学习了该框架之后,学习正确的 PHP 将比一开始就学习 PHP 困难得多。
首先,您假设这里没有人了解 PHP,并且我们都是设计师。其次,人们肯定不是以一种或另一种方式被“设定”的。以 Chris 为例。他几乎掌握了 HTML、CSS,并且有印刷设计的背景,同时他对 PHP、Javascript 尤其是 jQuery 也具有超过基本功能的知识。我认为这种能力描述了访问此网站的很多人。人们喜欢 CakePHP 的原因与他们喜欢 WordPress 或 jQuery 的原因相同。他们不想每次需要完成某些事情时都重新发明轮子。此外,扩展你的知识库绝对没有错,无论你主要做什么。
实际上,很多人确实倾向于某一种方式。我自己的情况表明,其他人也可能如此。
我可以编写代码,但在 CSS 之外,我在使内容具有表现力方面几乎无能为力。即使是按钮和布局对我来说也是一个问题。我相信我不是唯一一个。
我假设这里的大多数人主要是设计师,因为这是一个设计社区,而不是开发社区,并且绝大多数教程都侧重于 CSS、布局和其他图形内容。
Chris 显然了解 HTML 和 CSS,但对 Javascript 和 PHP 的工作知识与他在 HTML、CSS 和印刷版式方面的知识水平不同。jQuery 就像 Cake 一样,是一种简化事物的方式,因此在我看来不算数。
当然,学习新事物本身并没有错。如果没有人学习,就不会有人出现在这里。
也就是说,我相信如果您要学习 PHP,那么正确地学习它(与学习和依赖框架相比)才是正确的途径。稍后学习框架可以让您无需重复以前的工作(尽管我更喜欢将代码块保存在文件中并粘贴进去,而不是依赖于第三方框架),但一开始就正确地学习它意味着您会更多地了解正在发生的事情,并且可以真正为自己创造东西。
我实际上认为你错了。也许有些人确实更倾向于某一种方式。但看看 Chris。他既是一位优秀的设计师,也是一位优秀的程序员。如果我不知道 Chris 设计了这个网站(并且没有看到他之前的作品),我会认为 Chris 是计算机科学专业/毕业生。
其次,我认为框架很棒。虽然你说得对,它们确实简化了很多事情。但是,如果我现在必须去学习纯 JavaScript 并制作一些点击时淡出的东西,我可能永远也无法在没有 jQuery 的情况下做到这一点。
框架是当今的首选方式。如果你无法适应框架,你将被淘汰。
最后,如果你因为使用简化框架而导致知识不完整而遇到问题,有很多资源可以帮助你。我个人很喜欢StackOverflow.com,可以获得任何编程帮助和建议。我通常在问题发布后几分钟内就能得到回复。
我部分同意你的观点…
我同意,先学习PHP语言,然后在你感觉能够编写自己的代码时再跳入框架,这要明智得多。但是,我不认同人们在PHP编程和设计方面天生就有一种或另一种思维方式。我认识很多优秀的、有才华的设计师,他们也是编程高手,反之亦然。
感谢你的教程!
我是一个PHP程序员,主要是因为我喜欢它的简洁性,并且在开发中大量使用WordPress。但我认为这是一个很棒的资源,因为许多关于CakePHP或PHPbb等框架的教程并没有提供这种深入的工作流程。
然而,我同时也是一个铁杆图形/设计人员,当你简化了网络应用的开发,让那些负担不起程序员或没有时间学习语言复杂性的普通自由职业者也能使用时,我认为这使其成为一个优质的资源。
你随时可以回头投入更多时间来学习更多关于PHP或Ruby的知识。
好文章 :)
自从开始为一个社交网络开发自己的CMS以来,我一直想使用Cake或CodeIgniter这样的PHP框架。我不想使用Typo3或其他CMS,因为我没有自由去改变东西(至少在主代码中进行大量修改或创建插件时没有)。
我只是想知道CakePHP是否能够作为社交网络的后端,或者学习CakePHP到能够使用的程度是否需要花费太多时间(尽管如果它已经拥有CRUD和验证等功能,我认为以它为基础会比——正如你提到的——一遍又一遍地重新发明轮子容易得多)。
@Chris W. 你可能在寻找类似这样的东西。http://bit.ly/11GlMP 里面有很多好东西,但有一篇名为“用CakePHP在五分钟内创建社区”的文章。它不是一个拥有大量花哨功能的完整后端,但绝对是一个开始。
——干杯
谢谢老兄,我会看看的 :)
你不能因为有人费心解释不同类型的PHP/Javascript框架而责怪他们,尤其当你像我一样,经常“倒着学习”时。我对如何真正手动编写PHP或Javascript本身知之甚少。我读过一些教授PHP和Javascript的书籍片段,但我很难坚持读下去。通过观看Chris的WordPress屏幕录制,我开始理解为什么某些PHP代码片段会这样做,为什么有些会那样做。对于使用jQuery的一些免费资源,也是同样的道理。通过使用jQuery,我开始更多地了解Javascript。因此,我认为对于某些人来说,像这篇关于CakePHP的文章非常有价值。我仅仅学习CSS/XHTML一年半,我的技能充其量只能算中等,但嘿——每个人都有自己的起点。在理解设计上极其复杂的事物方面,Chris是我仰慕的网络专家。
框架对我来说最好的事情之一就是提供了可以拆解的“工作示例”。我从Cake、Flourish等框架中学到了OOP;我最终通过跟踪从concrete5首页到控制器和视图的代码,理解了MVC。
你好,Chris,
首先,我要祝贺你新的设计以及它提供的更好的用户体验。
对我来说,CakePHP是唯一最好的PHP框架。为什么?因为它速度快、易于使用、拥有最好的文档,当然也是程序员中的第一名。如果你需要帮助,可以在谷歌上搜索或在Stackoverflow.com上获得答案。
此致,
Adriano
我使用Cake超过一年了,我喜欢它,它易于使用。
我仅使用过一次Cake,当时对我来说很困难..
但这篇文章向我展示了它有多容易..
期待Cake未来的文章
非常感谢
不错。我在我的博客上开始了一个类似的系列http://www.codeforest.net。
我一定会关注这个
我真的很不喜欢这篇文章,对于任何不熟悉CakePHP的人来说,它过于复杂且描述不足,很可惜,Chris,也许你应该自己写这些文章:)不要再有客座文章了…
这篇文章如何帮助你开始使用Cake?它所做的只是告诉你如何获取一个带有预制项目的SVN仓库。糟糕的文章。
PS:CodeIgniter完胜Cake。
这似乎是一个系列中的第一部分。尽管由于没有总结段落来解释这一点,所以并不完全清楚。;)
我尝试过CodeIgniter,虽然它似乎是一个不错的项目,但我对在生产环境中使用它感到不舒服。
回家后,我将学习这个Cake教程。感谢客座文章!
我确实查看并尝试了几个PHP框架,并最终选择了Codeigniter,仅仅因为它简单、轻量且易于上手,并且拥有所有框架中最好的文档。我从未后悔过:D
嗨,
非常感谢这篇文章。期待Cakephp未来的文章。
就我个人而言,从技术/编程方面来学习图形方面的东西,我仍然发现更技术的文章非常有帮助。来自各个方面的人都会访问Chris的网站。一篇文章对一个群体可能不如对另一个群体有益。他不可能用所有文章取悦所有人。他会进行调查以了解我们想要学习什么,并且我认为他会尽量满足大多数人想要学习的内容。在选择哪些文章需要深入研究时,我喜欢使用购物车方法。当我去商店并在过道中行走时,我不会购买货架上的所有商品。我知道我需要什么,并选择我需要或想要的东西。这里也是一样的,如果一篇文章对你没有吸引力,它可能对其他人有吸引力,因为Chris会对他受众想要学习的内容进行调查。
我确实同意从长远来看,最好学习核心语言,但也没有理由不通过利用框架来缩短编码时间。如果你查看很多职位要求,它们通常不仅需要框架经验,还需要核心编码经验。因此,了解两者显然非常有益。一旦你掌握了纯编码方面,“是啊,没错”,没有理由不能结合使用框架来节省编码时间。也许你可以构建自己的框架以供将来项目重用,这样你就不用为每个新项目重新发明轮子。请记住,时间就是金钱,如果框架能够让我们更快地完成项目,那就意味着我们可以完成更多项目并赚更多钱 :)
所以,底线是,如果你不喜欢一篇文章,就不要浪费你的时间,等待与你所需或想要学习的内容更相关的文章。
~Jim Zak~
抱歉,第二段,第一句应该写成
我确实同意从长远来看,最好学习核心语言,但也没有理由**不**通过利用框架来缩短编码时间。
~Jim Zak~
没错,只要你理解框架内部发生了什么。如果它对你来说只是一个“魔术盒”,那么你可能不应该使用它。你的工作可能会效率低下、出现错误,甚至不安全。无论如何,你都不会从中获得最大的收益。
伙计,“地下流量蓝图”页面真的很糟糕。试图回到过去,让你发现自己在一个承诺一切、交付不了任何东西并且不允许你离开的登陆页面上?太烂了。
对其他人来说,救救自己,不要访问。
我是一个PHP新手——我只使用它来发送表单、包含和访问简单的数据库以生成在线列表。我正在寻找一些东西来帮助我,就像jQuery之于javascript一样简单。
从这篇文章来看,学习CakePHP看起来比学习纯PHP复杂得多。如果事实并非如此,你肯定给了我错误的印象!
很多网页设计/开发社区的人员需要身兼数职,因为这是工作的一部分,JavaScript/PHP 都是轻量级和动态的语言。编写和编译桌面开发者使用的 Java/C++ 代码可能更适合计算机科学专业的毕业生来比较。
我认为主要从事设计的人员学习这些 Web 语言并没有什么错,因为如果他们不学,就必须付费并依赖其他人来完成。正如其他人所说,“如果你想把事情做好,就自己动手做。”;)
Web 拥有一个基于客户端和服务器端技术的完整生态系统,利用这些技能可以让你更有价值。
我学习 CakePHP 有段时间了,但它就是无法在我的脑海中有效地加载,但在查看了你的示例之后,它让我更容易理解理论。
我刚开始使用 ZendFramework,因为我找不到关于 CakePHP 的那么多教程和帖子。在深入研究其中一个之前,我也可能会尝试一下。
一如既往的好文章,Chris。
看起来很有前景。实际上,我通常为 Ruby on Rails 开发。但 CakePHP 对更广泛的受众来说看起来更好。
在某种程度上,我与 Khalid 的观点产生共鸣,框架会阻碍你真正学习主要语言,但我认为框架非常必要且重要,但应该努力至少了解语言的基本功能和知识,有时我只是感谢像 Jquery 这样的客户端框架,它节省了 80% 的时间来编写令人恐惧的 JavaScript 代码……无需重新发明轮子。
我对应该从这篇文章中获得什么感到有点困惑。评论也没有帮助,因为大多数评论都在说框架的常用话题(我使用这个,或者我的更好)。我认为没有人真正阅读过这篇文章或尝试过这个应用程序,顺便说一句,该应用程序无法正常工作。这让我相信这是一系列文章的一部分……
所以,有人能澄清一下这是否是
1. 使用 Cake 构建事件管理器的教程。查看一些文件,编辑一些配置文件,上传 SQL。没有什么突破性的东西或教给我任何新东西……绝对没有向我展示 CakePHP 以及如何使用它……
2. 通过展示一个已完成的应用程序来介绍 Cake。这篇文章并没有真正深入到代码本身或实际的应用程序。
3. 一个大型教程系列,代码将在以后的时间完成并更深入地讲解……
我感到困惑……
你应该看看代码;)每一行都有注释;)
我想说明,这是一篇关于 CakePHP 及其使用方法的糟糕文章。我将“从头开始构建 Web 应用程序”作为此网站教程/操作方法的基线比较,因此我希望这篇文章与此类似或达到相同水平。
下次我建议你记录使用 CakePHP 创建此应用程序的过程,然后注意查看内部代码文件及其位置(你在上面提到的代码在哪里?)。此外,在 SVN 过程之后注意 Cake PHP 的正确设置,因为我和下面的 Daniel Langenakker 遇到了同样的问题。
我已经按照文章中的步骤操作了,但当我尝试注册用户时,它说找不到注册页面。我做错什么了吗?
看起来你的 Web 服务器有问题。你需要创建一个虚拟主机,名称类似于“cake-event-manager.dev”,并将文档根目录设置为……project_name/app/webroot
附注:不要忘记设置 /app/tmp 的访问权限。
如果你确定你的服务器正常工作,请尝试阅读这些文章。
需求
安装准备
安装
我个人更喜欢 Kohana(最初基于 CodeIgniter)而不是 CakePHP。它很棒 :)
可以分享一下原因吗?
谢谢
这个教程对我不起作用——这是 CSS-tuts 的第一次。其他大多数教程都很好。
无法加载页面。设置了配置。不确定它是否连接到 Mamp 或其他什么。
给我返回 404 错误,并且根目录上的图像无法加载。