点击这里:CakePHP应用开发:第 4章 控制器——编写应用的控制逻辑(3.操作以及参数)

  在第 3章节中我们已经了解了如何通过给链接地址添加些后缀从而把参数传输给个控制器中操作个典型Cake地址跟后面这个差不多http://你主机/控制器/操作 /参数在链接地址中附加到主机名称的后并用/分开东东就是所谓请求参数接下来我们就会深入了解控制器操作是如何处理这些请求参数

  动手时间:理解操作和参数

  1用下面代码修改Books控制器index操作:

<?php
 BooksController extends AppController { 
var $name = 'Books';
var $uses = .gif' />;
function index( $id = 0 ) {
$books = .gif' /> (
 
'0' => .gif' /> (
'book_title' => 'Object Oriented
Programming with PHP5',
'author' => 'Hasin Hayder',
'isbn' => '1847192564',
'release_date' => 'December 2007'
),
 
 
'1' => .gif' /> (
'book_title' => 'Building Websites
with Joomla! v1.0',
'author' => 'Hagen Graf',
'isbn' => '1904811949',
'release_date' => 'March 2006'
)
 
);
$id = val($id);
( $id < 0 || $id >= count($books) ) { 
 
 
$id = 0;
 
} 
 
 
$this->($books[$id] );
$this->('page_heading', 'Book Store');
$this->pageTitle = 'Welcome to the Packt Book Store!';
 
} 
 
 
}
?>


  2现在在浏览器中访问下面这些链接看看会在浏览器中显示些什么?

  http://localhost/applogic/books/index/0

  http://localhost/applogic/books/index/1

  http://localhost/applogic/books/index/xyz

  如何回事?

  我们首先重新创建了Books控制器index操作修改的后index操作就可接受个名为$id参数

  function index( $id = 0 )

  这意味着如果浏览器发送是http://localhost/applogic/books/index/1这个链接地址请求index$id参数就会被设置成1$id参数默认值为0因此如果链接地址后面没有提供请求参数(比如像这个链接http://localhost/applogic/books/index/)那么参数$id值就是为0.

  我们在index操作中定义了个名为$books$books 包含有两个元素其中两个区别书本相关信息

$books = .gif' /> ( 
'0' => .gif' /> (
'book_title' => 'Object Oriented Programming with PHP5',
'author' => 'Hasin Hayder',
'isbn' => '1847192564',
'release_date' => 'December 2007'
),
'1' => .gif' /> (
'book_title' => 'Building Websites with Joomla! v1.0',
'author' => 'Hagen Graf',
'isbn' => '1904811949',
'release_date' => 'March 2006'
)
);


  现在我们可以依赖于请求参数来显示相应书本信息如果提供请求参数是0我们就会把第0本书信息显示出来我们可以通过$id来获得请求参数然后我们将$books第$id个元素传送给试图文件

  $this->($books[$id] );

  我们先前创建视图文件(/app/views/books/index.ctp)也可是可以现实这点无需做改动如果现在有人访问了http://localhost/applogic/books/index/0这个地址链接index操作会显示第本书信息如果参数$id值是1就会显示第 2本书信息



  图片看不清楚?请点击这里查看原图(大图)

  但是万传送过来参数值是个无效参数——比如不是个整数或者是个比零小比1 大(1就$books中元素最大数目)遇到这些情况是我们代码只是给你抛出为了处理这些例外情况我们在操作中添加了条件判断如果发生上面这种例外情况我们将$id这种成0这样我们就避开了这 个

$id = val($id);
( $id < 0 || $id >= count($books) ) {
$id = 0;
}


  现在如果我们访问http://localhost/applogic/books/index/xyz这个链接浏览器只会显示第本书信息



  图片看不清楚?请点击这里查看原图(大图)

  仿照的前窍门技巧我们可以为某特定操作添加两个以及两个以上参数在下面

  动手时间中

  我们就会见到这样个例子

  动手时间:处理带有多个参数请求

  1创建个新控制器MathsController代码如下:

<?php
 MathsController extends AppController {
var $name = 'Maths';
var $uses = .gif' />; 
function add_digits( $digit1 = 0, $digit2 = 0, $digit3 = 0 ) {
$sum = val($digit1) + val($digit2) + val($digit3);
$this->('sum', $sum);
 
} 
 
 
} 
 
?>


  2创建对应视图文件add_digits.ctp(位置为/app/views/maths/add_digits.ctp)代码如下:

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

  3现在使用浏览器访问如下链接然后看浏览器会显示什么?

  http://localhost/applogic/maths/add_digit/1/2/3

  http://localhost/applogic/books/index/1/2

  如何回事?

  首先我们创建了个名为MathsController新控制器在这个控制器内部我们编写了个名为add_digits操作这个操作需要 3个参数每个参数默认值为0当通过请求执行这个操作时它会将传输过来 3个数字相加然后将结果传送给视图文件我们创建了个用来显示结果非常简单视图文件现在如果我们访问http://localhost/applogic/maths/add_digits/1/2/3 这个链接它应该会像下面这样显示数字123的和具体情况参见下图



  图片看不清楚?请点击这里查看原图(大图)

  Cake是如何处理发送进来请求

  Cake会自动确定指向合适控制器及其操作它会载入合适模型类以及正确视图文件如果使用者对规则遵循非常好通常事情都会随我们所愿而这些无需任何额外设置我们接下来就粗略了解下来这其中整个过程以便让我们对Cake是如何处理发送进来请求这个问题有清晰理解我们这里以BooksController为例假设http://localhost/applogic/books/index/123这样个地址链接请求发送给了Cake接下来我们就来看看Cake是如何处理

  Cake收到浏览器发送过来请求Cake会通过第个参数确定应该哪个控制器来处理这个请求这里我们目标控制器是BooksController

  Cake会将在 /app/controllers/books_controller.php文件中找到对象——BooksController类例子化(instantiates )

  它也会载入/app/models/book.php 文件中找到对应模型类Book在这里我们目标控制器被设置成不使用任何模型因此实际上它不会载入和寻找相应模型类

  下个参数指名了需要操作如果第 2个参数没有提供它会自动指向默认操作index在这里第 2个参数指向目标操作是index

  Cake了目标控制器对应目标操作即BooksControllerindex操作如果请求还提供了另外参数Cake会将它作为操作参数传送给目标操作在我们这个例子中额外提供参数值为123因此123作为参数传送给BooksControllerindex操作

  Cake会根据控制器名称和操作名称确定视图文件位置即app/views/books/目录下index.ctp文件然后它会解析视图文件然后将解析好视图文件作为个响应发送回浏览器



  上面这些就是Cake般处理发送过来请求流程但是我们也可通过配置我们控制器模型或者路径来覆盖Cake默认流程我们会在书其他部分学习这些内容因此请继续阅读



Tags:  网络控制器 点击这里

延伸阅读

最新评论

发表评论