Posts Tagged ‘ MVC

CakePHP自学笔记(五):Cake中的MVC开发

AquarTutorial 第一期
-CakePHP自学笔记

(一):利用Ubuntu搭建开发环境
(二):数据库配置与连接
(三):MVC开发模式简介
(四):CakePHP的命名规范
>>(五):Cake中的MVC开发

<-<-<-<-<-<-<-<-<-<-<-<-<-

行为、组件、助手

或许你已经听过很多遍那句经典的“不要重复发明轮子”了,同样,为了提高代码重用,Cake提供了Behavior(行为)、Component(组件)、Helper(助手),分别作为Model(模型)、Controller(控制器)、View(视图)的“扩展”。说白了,就跟C的标准库一样,想使用行为、组件或助手的功能,只要声明一下就OK了。

我目前比较常用的核心组件是Auth(认证系统),助手有Form(表格)、Session(会话控制)、html(快速创建html标签)等。

使用扩展

前面说过,要使用扩展,只要在模型、控制器中声明就可以了(核心助手不用声明)。示例代码:

<?php
class ExampleController extends AppController {
	var $components = array('Auth');
} 
?>

在模型中使用行为与此类似。

有时候,像Auth认证系统这样的组件是整站都需要的,我们可以在app/app_controller.php文件中向AppController类中引入Auth,这样所有继承自AppController的控制器也都有Auth了。也就是:

<?php
class AppController extends Controller {
	var $components = array('Auth');
} 
?>

回调函数

这个名词具体是什么意思我还不很明白。跟某陈小讨论了一下,他给我两个网址(CNEN)我还没仔细看,不过wiki上那个图片是让我懂了它为什么叫这个名字,回调的意思就是主程序调用一个库函数(级别不同),而此库函数调用了一个和主程序同样级别的函数,也即“回调”。总之呢,我现在也只用一个Callback Function就是beforeFilter()。

回调函数可以用来设置一些配置选项,或者在页面跳转之前执行某些动作。

比如我用beforeFilter来设置Auth的一些参数:

function beforeFilter() {
    $this->Auth->allow('login', 'add', 'view', 'index');
    $this->Auth->loginRedirect = array('action' => 'home');
}

这里beforeFilter是控制器的回调函数,它在任何函数被执行前执行。

CakePHP自学笔记(四):CakePHP的命名规范

AquarTutorial 第一期
-CakePHP自学笔记

(一):利用Ubuntu搭建开发环境
(二):数据库配置与连接
(三):MVC开发模式简介
>>(四):CakePHP的命名规范

<-<-<-<-<-<-<-<-<-<-<-<-<-

基本的命名规则

上篇笔记中我们刚刚对MVC开发模式有了一个简单的认识,在进行开发之前,我们首先要熟悉CakePHP的一些命名规范,所谓命名规范也就是数据表、模型文件、模型、控制器文件、控制器、视图文件等的命名的一些规范,注意这是规范不是规定,即并不是必须的,但遵循默认的命名规范能大大加快开发速度,并减少不必要的麻烦。

比如你要给程序添加一系列关于物品(item)的功能,比如查看、购买等等,你最好:

  1. 用items命名数据表;
  2. 用item.php命名模型文件,放在app/models目录下,用Item命名我们的模型(见下文);
  3. 用items_controller.php命名控制器文件,放在app/controllers目录下,用Items命名我们的控制器
  4. 在app/views目录下建立items子目录

注意有几处单复数的差别。

示范代码

终于到动手写写代码的时候了,首先打开app/models/item.php添加如下代码:

<?php
class Item extends AppModel{
	var $name = 'Item';
}
?>

然后继续修改app/controllers/items_controller.php。

<?php
class ItemsController extends AppController {
    var $name = 'Items';
?>

这样就完成了最基本的模型和控制器,我们所写的模型都继承AppModel类,而AppModel类又继承Model类,同样,程序中的控制器都继承AppController类,后者又继承Controller类,此处Model类和Controller类都由CakePHP的内核提供。我们可以更改AppController类,比如增加Auth组件,这样程序的所有控制器都会默认加载这个组件。

注意我们并没有为模型指明具体的数据表,也没有为控制器指明要使用的模型,这就是CakePHP命名规范的作用:默认情况下,单数命名的模型会自动调用复数命名的数据表(比如Item这个模型就会默认与items这个数据表交互),复数命名的控制器会自动调用单数命名的模型(所以ItemsController会默认调用Item这个模型),最后视图会自动接受控制器的相应函数返回的数据,马上就来实现一个视图。

函数和视图

一个控制器可能有很多函数,而每个函数都有相对应的视图,所以我们要在控制器对应的视图目录下以函数名添加视图。这里插一句CakePHP构造链接的方法,比如这个items控制器有个buy函数来实现购买功能,这时如果CakePHP的程序所在的目录是http://www.example.com/cake,那么这个buy函数对应的视图渲染的页面就是http://www.example.com/cake/items/buy,而如果我们访问http://www.example.com/cake/items,即直接访问这个控制器,Cake会默认返回index函数及其视图。

下面我们为Items这个控制器添加index函数,简单地返回所有items数据表中的条目。修改app/controllers/items_controller.php。

<?php
class ItemsController extends AppController {
    var $name = 'Items';
    function index() {
        $this->set('items',$this->Item->find('all'));
    }
?>

这里set函数就是用来从控制器向视图传递数据的,它会以数组的形式传递数据。具体可以看这个页面

然后我们创建app/views/items/index.ctp文件并添加如下内容:

<h1>Show Items</h1>
 
<table>
	<tr>
		<th>Id</th>
		<th>Name</th>
	</tr>
 
	<?php foreach ($items as $item): ?>
	<tr>
		<td><?php echo $item['Item']['id']; ?></td>
		<td><?php echo $item['Item']['name']; ?></td>
	</tr>
	<?php endforeach; ?>
 
</table>

在数据表中添加一些数据(此处我们假定只展示数据表中id和name两项),然后访问http://localhost/caketest/items就能看到一个展示items数据的表格。

P.S.对于多词组的名字,命名规范如下:

  • 数据表名:user_profiles;
  • 模型名:UserProfile,模型文件名:user_profile.php;
  • 控制器名:UserProfilesController,控制器文件名:user_profiles_controller.php
  • 视图文件目录:user_profiles

CakePHP自学笔记(三):MVC开发模式简介

AquarTutorial 第一期
-CakePHP自学笔记

(一):利用Ubuntu搭建开发环境
(二):数据库配置与连接
>>(三):MVC开发模式简介

<-<-<-<-<-<-<-<-<-<-<-<-<-

关于MVC

CakePHP遵循MVC开发模式,所谓MVC也就是Model-View-Controller的首字母缩写,MVC开发模式把应用程序开发分成三个部分,Model即模型用于管理数据,View即视图用来制作用户界面,而Controller即控制器管理应用程序的逻辑。下图演示采用MVC开发的程序如何响应用户的请求:

MVC请求演示

MVC请求演示


用户点击某个链接后,分发器会调用相应的控制器及函数,控制器会向模型请求数据,并做一些动作比如验证是否登录或者向模型写入数据,然后把需要展示的内容返回给视图,最后视图渲染网页返回给用户。

MVC的优点在于添加或移除系统组件很方便,可以说是一种迭代式开发,这样做成的系统扩展性很强,组件的重用性也很好。引述CakePHP手册:

为什么要用 MVC模式 呢? 因为它是一个经过考验的真正的软件设计模型,它可以使程序成为可维护的、模块化的和快速开发的包。使用分离的模型(Model)、视图(View)和控制器(Controller)组织的程序是轻便的。新的特性很容易就被加入,旧的程序换上新的外观也是一下子的功夫。模块化和分离的设计使得开发者和设计者能够同时工作,这包括了快速 原型的能力。分离的设计令开发者可以修改应用的一部分而不会影响到其他部分。

如果你从来没有用过这种方法建立应用,适应它需要一些努力,但是我们相信一旦你使用CakePHP建立了你的第一个应用,你不会再想用其他方法建立你的应用了。

MVC下的快速开发

一般来说,要给CakePHP程序添加新的功能需要如下几步:

  1. 在数据库中新建一个数据表;
  2. 在app/models目录下新建一个Model文件;
  3. 在app/controllers目录下新建一个Controller文件;
  4. 在app/views目录下新建一个目录,在该目录中针对Controller中的每个函数新建一个View文件。

这样就已经把全新的功能添加到了CakePHP中,当然,你可能还需要修改其他的MVC以便整合。

接下来说说CakePHP的一些命名规范,之后再用MVC给这个网站添加一个功能。

CakePHP自学笔记(二):数据库配置与连接

AquarTutorial 第一期
-CakePHP自学笔记

(一):利用Ubuntu搭建开发环境
>>(二):数据库配置与连接

<-<-<-<-<-<-<-<-<-<-<-<-<-

建立数据库、数据表

我们用phpMyAdmin管理数据库,用浏览器打开 http://localhost/phpmyadmin 用户名输入root,密码就是安装phpMyAdmin时设置的密码。

登录后,新建一个数据库,比如cakedb,同时注意选择字符集。建立数据库后,默认会赋予root用户全部权限。

打开cakedb数据库,你可以很方便地添加数据表,字段等等。

连接到数据库

然后我们要让Cake和刚刚建立的数据库连接起来,这项工作只需要我们更改app/config里面的一个配置文件,进入/var/www/caketest目录,你可以把这个目录添加到自己的书签里方便以后访问,在app/config/目录中新建database.php文件并用gedit打开,我们只要修改从81行(要查看行号,可以在编辑->首选项里面打开“显示行号”)开始的几行配置:

81
82
83
84
85
86
87
88
89
90
	var $default = array(
		'driver' => 'mysql',
		'persistent' => false,
		'host' => 'localhost',
		'login' => 'root',
		'password' => 'somepassword',
		'database' => 'cakedb',
                'encoding' => 'utf8',
		'prefix' => '',
	);

其中,login和password分别添有数据库全部权限的用户的用户名和密码,database添数据库的名称,encoding是需要手动写上去的,强制用utf8编码。改好后保存,刷新 http://localhost/caketest 页面,应该是下面这样:

Database Connected

Database Connected


就表明Cake已经成功地连接了数据库。

P.S.注意这个页面中有提示
Notice (1024): Please change the value of ‘Security.salt’ in app/config/core.php to a salt value specific to your application [CORE/cake/libs/debugger.php, line 549]
这是要你去改app/config/core.php中的’Security.salt’值(在第151行),这个值是Cake用来算Hash时(比如验证密码等)需要用到的,为了安全一定要设置一个不容易猜到的字符串。

Page 1 of 11