Actions

你可以通过定义一个以action_为前缀的公用方法,为你的控制器创建动作。任何不是声明为public,且不是以action_为前缀的方法,都不能通过路由被调用。
public function action_hello() { $this->response->body(View::factory('hello/world')); // This will load views/hello/world.php }

参数

参数可以通过$this->request->param('name') 方法进行调用。其中的 name是在路由中定义的name。
// Assuming Route::set('example','(/(/(/)))'); public function action_foobar() { $id = $this->request->param('id'); $new = $this->request->param('new');
如果参数没有设置,调用时将返回NULL。你在调用时,可以提供第二个参数,以便在没有默认值的情况下,设置一个默认值返回。

public function action_foobar() { // 如果url中没有user参数,$id将会是false $id = $this->request->param('user',FALSE);

示例

一个product页面的的是view action

public function action_view() { $product = new Model_Product($this->request->param('id')); if ( ! $product->loaded()) { throw new HTTP_Exception_404('Product not found!'); } $this->response->body(View::factory('product/view') ->set('product', $product)); }
用户登录的action.

public function action_login() { $view = View::factory('user/login'); if ($_POST) { // Try to login if (Auth::instance()->login(arr::get($_POST, 'username'), arr::get($_POST, 'password'))) { Request::current()->redirect('home'); } $view->errors = 'Invalid email or password'; } $this->response->body($view); }

Before and after

你可以在程序执行之前或者执行完之后使用 before() 和after()函数。例如,你可以检查用户是否已经登录,设置模板视图,加载一个需要的文件等等。
你可以通过$this->request->action检测正在请求的是什么action,并且做一些处理,例如在使用一个控制器时要求用户登录,除非正在使用登录的action
// 在before中,检测用户的授权/登录,不通过的话,进行重定向 Controller_Admin extends Controller { public function before() { // 如果这个用户不在admin组,并且没有登录,跳转到登录页 if ( ! Auth::instance()->logged_in('admin') AND $this->request->action !== 'login') { $this->request->redirect('admin/login'); } } public function action_login() { ...
摘自"http://kofans.org/3.2/guide/kohana/mvc/controllers"