状态 草稿
Todo sub-folders, method parameters, remapping example, Proof read
官方最后更新时间 2008/11/02 15:03

控制器(Controllers)

控制器模型和视图是程序的组成部分。控制器把改变的数据的信息传递模型或者从模型获取信.例如,数据库插入,更新,删除数据。控制器通过模型传递信息并传给视图,视图是用户的最终呈现。

控制器也可以当作 URL,详情请参见 Kohana URLs

控制器命名和解析

控制器的文件名基本上可以是任意设置,但控制器的类(class)名必须与文件名一致。

控制器约定

  • 必须存放在 controllers 或其子目录下面
  • 控制器的文件名必须小写。比如 articles.php
  • 控制器的类名必须是控制器首字母大写的文件名加 _Controller。比如 Articles_Controller
  • 必须继承 Controller 类
  • 以 '_' 开头的方法不能被 URI 的参数映射。 比如: _do_something()

一个简单的控制器

现在我们创建一个简单的控制器。功能在浏览器 输出 Hello World 。

文件:application/controllers/article.php

class Article_Controller extends Controller
{
    public function index()
    {
        echo 'Hello World!';
    }
}

Ok,现在打开浏览器浏览(yoursite.com/article),你会看到

Hello World

怎么样?就这么简单吧。

高级控制器

在上面的例子中,访问 yoursite.com/articleURL 第二个分段为空是执行的 index() 方法。即:yoursite.com/article/index

如果第二个分段不为空则执行指定的控制器里的方法。

application/controllers/article.php

class Article_Controller extends Controller
{
    public function index()
    {
        echo 'Hello World!';
    }
 
    public function overview()
    {
        echo 'Article list goes here!';
    }
}

现在试着访问 yoursite.com/article/overview 看看会显示什么。

Article list goes here!

带参数的控制器

那么如果想显示指定的文章怎么办?比方说,我们要显示一篇名为 your-article-title 的文章,而这篇文章的 id 为 1。

实现这个就好像是这样的 yoursite.com/article/view/your-article-title/1 ,最后的两个分段即使通过调用 view() 方法里面的两个参数实现的。

application/controllers/article.php

class Article_Controller extends Controller
{
    public function index()
    {
        echo 'Hello World!';
    }
 
    public function overview()
    {
        echo 'Article list goes here!';
    }
 
    public function view($title,$id)
    {
        echo $id . ' - ' . $title;
        // 假如是显示从数据库中查询 id 和标题
    }
}

当我们访问 yoursite.com/article/view/your-article-title/1 则显示

1 - your-article-title

控制器和子目录

如果你把一个控制器放在了 /controllers/ 目录下面的一个子目录了,Kohana 是会检索其子目录里面的控制器映射的。比如,一个文件存放在 application/controllers/admin/user.phpURL 则会是这样 http://localhost/admin/user

控制器路由(Routing controllers

出于某种原因,你的URI 或许不能与控制的方法对应是可以使用 URI 路由再映射。比如:localhost/about/me 映射为 http://localhost/articles/view/1

详情请参见 路由(Routing)

特殊方法

__construct

如果你在控制器中声明一个构造函数,比如加载一些资源的配置,你可以调用父类的构造函数。

application/controllers/article.php

class Article_Controller extends Controller
{
    protected $db;
    protected $session;
 
    public function __construct()
    {
        parent::__construct(); // 必须包含这个
 
        $this->db = Database::instance();
        $this->session = Session::instance();
    }
 
    public function index()
    {
        $this->session->get('user_id');
    }
 
    public function view($article_id)
    {
        $article = $this->db->getwhere('articles', array('id' => (int) $article_id));
    }
}

在这个例子中你可以通过 URL 分段参数从数据库重新显示文章。如果你访问 yoursite.com/article/view/5,则会重新获取 id5 文章。

index

URL 中没有其他别的方法时, 控制器会自动调用 index() 方法。比如,控制名为 Welcome_Controller,当访问 http://yoursite.com/welcome 时调用 index 方法。

提示: 你不能在 index 方法中传递参数,除非 URI 包含 两个参数在 index 方法内。

__call

当控制器调用的方法不存在是会自动调用 _ _call($method, $arguments) 方法,它是在控制器被调用,默认是一个 404 错误。你可以复写这个方法。

application/controllers/article.php

class Article_Controller extends Controller
{
    public function __call($method,$arguments)
    {
        $id=(int) $method;
        $this->view($id);
    }
 
    public function view($id)
    {
        echo $id;
        // 假如是显示从数据库中查询 id
    }
}

当访问 yoursite.com/article/1 它会显示文章,你可以第二分段用到的 $id 被替换掉了。

私有方法

有时候你不希望你的方法被调用在 Webapps 中,只希望它在控制器内部能被访问,你可通过声明方法为 private 或者在其方法名前加 _ 前缀。

application/controllers/article.php

class Article_Controller extends Controller
{
    public function index()
    {
        echo 'Hello World!';
    }
 
    private function _article_form()
    {
        echo 'Article form';
    }
}

尝试这访问 yoursite.com/article/_article_form ,你将得到一个 404 错误。

特殊控制器

在 Kohana 程序中使用一个基控制器(base controller)

在 Kohana 程序中使用一个基控制器也是很有用途的,你可以在任何页面执行,比如进行用户认证和授权,以及对 Session 处理都非常有用。

实例 MY_Controller.php

<?php
 
class Controller extends Controller_Core
{
    public function __construct()
    {
        parent::__construct();
 
        // 这里可以写一些认证
    }
 
    public function do_something()
    {
        // 在所有控制器激活的方法
    }
}

这个文件可以命名为 MY_Controller.php,可以放到 application/libraries 目录下面。且这个类具有基类的所有方法加上你自己定义的方法。

提示:前缀 MY_ 是可以在 application/config/config.php 文件中的 $config['extension_prefix'] 参数配置。

general/controllers.txt · 最后更改: 2008/11/02 17:11 由 icyleaf