| 状态 | 草稿 |
|---|---|
| Todo | sub-folders, method parameters, remapping example, Proof read |
| 官方最后更新时间 | 2008/11/02 15:03 |
控制器模型和视图是程序的组成部分。控制器把改变的数据的信息传递模型或者从模型获取信.例如,数据库插入,更新,删除数据。控制器通过模型传递信息并传给视图,视图是用户的最终呈现。
控制器也可以当作 URL,详情请参见 Kohana URLs 。
控制器的文件名基本上可以是任意设置,但控制器的类(class)名必须与文件名一致。
控制器约定
controllers 或其子目录下面articles.php现在我们创建一个简单的控制器。功能在浏览器 输出 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/article 且 URL 第二个分段为空是执行的 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.php 其 URL 则会是这样 http://localhost/admin/user
出于某种原因,你的URI 或许不能与控制的方法对应是可以使用 URI 路由再映射。比如:localhost/about/me 映射为 http://localhost/articles/view/1
详情请参见 路由(Routing)。
如果你在控制器中声明一个构造函数,比如加载一些资源的配置,你可以调用父类的构造函数。
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,则会重新获取 id 为 5 文章。
当 URL 中没有其他别的方法时, 控制器会自动调用 index() 方法。比如,控制名为 Welcome_Controller,当访问 http://yoursite.com/welcome 时调用 index 方法。
提示: 你不能在 index 方法中传递参数,除非 URI 包含 两个参数在 index 方法内。
当控制器调用的方法不存在是会自动调用 _ _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 程序中使用一个基控制器也是很有用途的,你可以在任何页面执行,比如进行用户认证和授权,以及对 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'] 参数配置。