`

一步一步学习CakePHP(二)controllers

    博客分类:
  • php
 
阅读更多

我们已经知道,controllers就是负责处理客户端的请求,实现models和views的交互。在CakePHP中,在controller中的每一个公共的方法都被叫做“action”,每一个action就会代表一个url,在浏览器请求此url时,控制器将会使用model来操作和处理数据,当数据被处理后,那么控制器把结果从model被传送到view。

我们接下来会学习控制器的具体细节。

一:与model的交互

一般说来,一个控制器会处理一个对于model的业务逻辑,控制器就会自动地找到对应的model。但是这也不是绝对的,有时,我们也需要某控制器不依赖于任何model,这时候,需要配置控制器。举例说明,

控制器:books_controller.php

<?php 
/* 
* To change this template, choose Tools | Templates 
* and open the template in the editor. 
*/ 
class BooksController extends AppController{ 
    var $name = 'Books'; 
    var $uses = array(); 
    function index(){ 
    } 
}

?>

view:index.ctp

<h2>the China-pub website</h2> 
<p>New Books Comming Soon!</p>

在这个控制器中,定义了一个属性$uses,它明确定义了控制器相关的model,如果不定义,控制器将会根据名称来找到对应的model,如果赋予一个空的数组,也就是说,没有用的任何的model。

clip_image002

综上:控制器和model的关联有两种方式,一是自动绑定,而是人为手工绑定。如:$uses = array ( 'ModelName1', 'ModelName2' ) 。

二:传送数据到view

CakePHP为控制器的action定义恰当的view文件,控制器也提供给view处理完成后的数据。如:$this->set($book);可以用set自动把数据传送到view。

控制器:books_controller.php

<?php 
/* 
* To change this template, choose Tools | Templates 
* and open the template in the editor. 
*/ 
class BooksController extends AppController{ 
    var $name = 'Books'; 
    var $uses = array(); 
    function index(){ 
        $this->set('page_heading','china-pub book store'); 
        $book = array( 
            'book_title' => 'asp.net 3.5服务器控件开发', 
            'author' => '郑健', 
            'release_date' => '2009.2' 
        ); 
        $this->set($book); 
        $this->pageTitle = '欢迎来到china-pub'; 
    } 

?>

view:index.ctp

<h2><?php echo $page_heading; ?></h2> 
<dl> 
<lh><?php echo $bookTitle; ?></lh> 
<dt>author:</dt><dd><?php echo $author; ?></dd> 
<dt>Release Date:</dt><dd><?php echo $releaseDate; ?></dd> 
</dl>

clip_image004 
三:带有参数的控制器action

控制器:books_controller.php

<?php 
/* 
* To change this template, choose Tools | Templates 
* and open the template in the editor. 
*/ 
class BooksController extends AppController{ 
    var $name = 'Books'; 
    var $uses = array(); 
    function index( $id = 0 ){ 
        $this->set('page_heading','china-pub book store'); 
        $book = array( 
            '0' => array( 
                'book_title' => 'asp.net 3.5服务器控件开发', 
                'author' => '郑健', 
                'release_date' => '2009.2' 
            ), 
            '1' => array( 
                'book_title' => '银光志', 
                'author' => '魏永超', 
                'release_date' => '2009.12' 
            ) 
        ); 
        $id = intval($id); 
        if( $id <0 || $id >= count($book)){ 
            $id = 0; 
        } 
        $this->set($book[$id]); 
        $this->pageTitle = '欢迎来到china-pub'; 
    } 

?>

接下来我们看下列链接

http://localhost:8080/applogic/Books/index/0

clip_image006

http://localhost:8080/applogic/Books/index/1

clip_image008

http://localhost:8080/applogic/Books/index/aaa

clip_image010

如果存在多个参数的话,举例说明:

控制器,maths_controller.php

<?php 
/* 
* To change this template, choose Tools | Templates 
* and open the template in the editor. 
*/ 
class MathsController extends AppController{ 
    var $name = 'Maths'; 
    var $uses = array();

    function add_digits($digit1 = 0, $digit2 = 0, $digit3 = 0 ){ 
        $sum = intval($digit1) + intval($digit2) + intval($digit3); 
        $this->set('sum',$sum); 
    } 

?>

view:

<h2>The sum is equal to <?php echo $sum; ?></h2>

clip_image012

四:从view中获取数据

users_controller.php

<?php 
/* 
* To change this template, choose Tools | Templates 
* and open the template in the editor. 
*/ 
class UsersController extends AppController{ 
    var $name = 'Users'; 
    var $uses = array(); 
/* 
* 控制器中的$data,它用来存放从HTML表单传过来的POST数据。 
*/ 
    function index(){ 
        if(!empty ($this->data)){ 
            echo $this->data['姓名']; 
            //不用渲染任何view 
            $this->autoRender = false; 
        } 
    } 

?>

view:index.ctp

<?php echo $form->create(null, array('action' => 'index')); ?> 
<fieldset> 
<legend>请输入您的姓名:</legend> 
<?php echo $form->input('姓名') ?> 
</fieldset> 
<?php echo $form->end('go'); ?>

clip_image014

clip_image016

如果输入一个姓名,并且提交,$data会被POST数据填充,$this->data将不为空,那么在浏览器上就会打印出名字来。

五:重定向 
在PHP程序中,我们使用header(),CakePHP中,使用redirect()作用于action。

<?php 
/* 
* To change this template, choose Tools | Templates 
* and open the template in the editor. 
*/ 
class UsersController extends AppController{ 
    var $name = 'Users'; 
    var $uses = array(); 
/* 
* 控制器中的$data,它用来存放从HTML表单传过来的POST数据。 
*/ 
    function index(){ 
        if(!empty ($this->data)){ 
            $this->redirect(array('controller'=>'users', 
                    'action'=>'welcome',urlencode($this->data['姓名']))); 
        } 
    } 
    a 
    function welcome($name=null){ 
        if(empty ($name)){ 
            $this->Session->setFlash('Please provide your name!',true); 
            $this->redirect(array('controller'=>'users','action'=>'index')); 
        } 
        $this->set('name', urldecode($name)); 
    } 

?>

clip_image018

clip_image020 
六:AppController

我们知道,CakePHP中,所定义的控制器都是从AppController继承而来,也就是说,它是所有控制器的父类,那么我们就可以在AppController中定义公共的方法,在所有的控制器中都可以使用。

如:我们修改前面的代码:

在app文件夹中增加:app_controller.php

<?php 
/* 
* To change this template, choose Tools | Templates 
* and open the template in the editor. 
*/ 
class AppController extends Controller{ 
    function strip_and_clean($id,$array){ 
        $id = intval($id); 
        if($id < 0 || $id >= count($array)){ 
            $id = 0; 
        } 
        return $id; 
    } 

?>

修改books_controller.php

<?php 
/* 
* To change this template, choose Tools | Templates 
* and open the template in the editor. 
*/ 
class BooksController extends AppController{ 
    var $name = 'Books'; 
    var $uses = array(); 
    function index( $id = 0 ){ 
        $this->set('page_heading','china-pub book store'); 
        $book = array( 
            '0' => array( 
                'book_title' => 'asp.net 3.5服务器控件开发', 
                'author' => '郑健', 
                'release_date' => '2009.2' 
            ), 
            '1' => array( 
                'book_title' => '银光志', 
                'author' => '魏永超', 
                'release_date' => '2009.12' 
            ) 
        ); 
        $id = $this->strip_and_clean($id, $book); 
        $this->set($book[$id]); 
        $this->pageTitle = '欢迎来到china-pub'; 
    } 

?>

我们可以得到相同的效果

七:在控制器中使用components

在/app/controllers/components中创建util.php

<?php 
   class UtilComponent extends Object 
   { 
      function strip_and_clean ( $id, $array) { 
         $id = intval($id); 
         if( $id < 0 || $id >= count($array) ) { 
               $id = 0; 
         } 
         return $id; 
      } 
   } 
   ?>

删除在AppController中定义的strip_and_clean方法

调用:

var $components = array('Util');

$id = $this->Util->strip_and_clean($id);

这样我们也可以得到相同的效果。

分享到:
评论

相关推荐

    cakephp学习笔记

    CakePHP 的核心特性之一是它的CRUD操作,即创建(Create)、读取(Read)、更新(Update)和删除(Delete),这简化了数据库的交互。 代码生成器(Code Generation)是另一个亮点,它可以帮助开发者自动生成基础的...

    cakephp 框架书籍 英文版

    ### CakePHP框架书籍知识点概述 #### 一、Getting Started(开始使用) ...这本书籍涵盖了从基础概念到高级主题的各个方面,对于希望学习和使用CakePHP框架的开发者来说,是一份非常全面且有价值的资源。

    cakephp框架 学习ing

    在这个"cakephp框架 学习ing"的主题中,我们将深入探讨 CakePHP 的核心特性、优势以及如何开始学习和使用它。 首先,让我们了解MVC模式。MVC是一种软件设计模式,将业务逻辑(Model)、用户界面(View)和数据控制...

    PHP的框架之CakePHP-CakePHP教程

    打包下载,里面有CakePHP的框架源码,下载后可直接使用,版本是1.1的,稳定版;CakePHP的分页组件源码;CakePHP的中文及英文教程,CHM格式;CakePHP的中文打印版教程,WORD格式,下载后可直接打印,方便的;CakePHP...

    cakephp-1.2 manual

    10. **调试与性能优化**:学习如何使用 CakePHP 的调试模式进行问题排查,以及如何进行性能优化,如使用缓存和优化查询。 11. **插件(Plugins)**:CakePHP 插件允许你重用和扩展框架的功能,手册会解释如何安装、...

    cakephp php-framework

    There are two main ways to get a fresh copy of CakePHP. You can either download an archive copy (zip/tar.gz/tar.bz2) from the main website, or check out the code from the git repository. To download ...

    CakePHP 3.4 开发手册文档 CakePHP Cookbook Documentation Release 3.4

    ### CakePHP 3.4 开发手册文档概览 #### CakePHP 一瞥 ...这份文档不仅涵盖了框架的基础知识,还深入探讨了高级主题和技术细节,对于任何希望深入了解和使用 CakePHP 的开发者来说都是宝贵的学习资源。

    CakePHP 1.2 API 中文文档

    **CakePHP 1.2 API 中文... CakePHP 1.2 API 中文文档覆盖了框架的主要组件、类库和方法,是开发者学习和使用该框架的重要参考资料。通过深入理解和实践这些知识点,开发者能够高效地构建稳定、可维护的PHP Web应用。

    CakePHP PHP MVC框架

    - **访问脚本之家.html**:可能是一个关于CakePHP或其他PHP技术的文章链接,提供更多的学习资源。 - **readme.txt**:通常包含项目的基本信息、安装指南或注意事项,对于理解项目结构和运行要求很有帮助。 综上所述...

    用cakephp实现的商城系统

    用cakephp实现的简单商城系统,有基本的商城管理功能和会员注册管理功能,代码简洁易懂,直接输入http://域名/install.php...此商城系统是一个比较典型的cakephp案例,比较适合一些有意学习cakephp的人进行研究学习……

    PHP的框架之CakePHP-CakePHP教程终极教程

    打包下载,里面有CakePHP的框架源码,下载后可直接使用,版本是1.1的,稳定版;CakePHP的分页组件源码;CakePHP的中文及英文教程,CHM格式;CakePHP的中文打印版教程,WORD格式,下载后可直接打印,方便的;CakePHP...

    cakephp 框架1.3.11版本

    了解这些信息后,对于想要学习或回顾早期CakePHP的开发者来说,这个压缩包是一个宝贵的资源。通过阅读说明文档、研究源代码以及参考chinaz.com提供的资料,可以深入理解 CakePHP 1.3.11 的工作原理,从而更好地应用...

    cakephp框架源码

    《深入理解CakePHP框架源码》 CakePHP是一款基于MVC(Model-View-Controller)设计模式的开源PHP框架,它的出现旨在简化Web应用的开发流程,提高开发效率。源码阅读是理解任何框架本质的重要途径,对于CakePHP也不...

    cakephp 框架

    CakePHP 拥有活跃的社区,提供详尽的官方文档,包括教程、API 文档和最佳实践指南,为开发者提供了丰富的学习资源。 总之,CakePHP 框架以其高效、灵活和易用性,成为PHP开发者的热门选择。它不仅简化了Web应用的...

    CakePHP1.2.3.8166.7z CakePHP最新稳定版

    其中,模型(models)存放数据库操作的类,视图(views)负责数据的展示,控制器(controllers)处理用户请求并协调模型和视图。 六、cake目录 “cake”是CakePHP框架的核心组件,包含了框架的所有核心类和库。...

    CakePHP框架指南

    CakePHP框架是一个开源的PHP开发框架,它遵循了...学习CakePHP框架指南是一个不断成长和深化的过程。这本指南不仅仅是初学者的教程,也包含了高级开发者所需要的信息,帮助他们深入理解框架的内部工作原理和高级特性。

    cakephp中文手册

    #### 二、CakePHP 目录结构 **2.1 主要目录说明** CakePHP 解压后的目录结构主要包括以下三个主要部分: - **app**:应用程序的核心文件所在位置。 - **cake**:核心库文件,通常不应该直接修改。 - **vendors**...

    cakephp-1.3.21.zip

    二、CakePHP 1.3.21特性 1. 数据验证:提供内置的验证规则,可轻松确保输入数据的有效性,减少程序错误。 2. 蛋糕式路由:自动映射URL到控制器方法,简化URL管理和路由配置。 3. 自动化 CRUD:支持快速创建、读取...

Global site tag (gtag.js) - Google Analytics