最喜欢的Kohana提示和特点?

受到其他社区维基的启发,我有兴趣了解一些鲜为人知的Kohana提示,技巧和function。

  • 请每个答案只包含一个提示。
  • 如有必要添加Kohana版本。

这是一个社区维基

从数据库结果生成Form :: select()选项

Kohana 3.1和3.0

$options = ORM::factory('model') ->order_by('title','ASC') ->find_all() ->as_array('id','title'); $select = Form::select('name', $options); 

应该注意的是,这不限于ORM,可以用于所有的数据库结果(它们都支持as_array)。 查看数据库结果信息了解更多详细信息。

如果你想添加一个默认选项:

 $options = Arr::merge(array('Please select a value.'), $options); 

显示最后执行的查询

Kohana 3.1和3.0

 echo Database::instance()->last_query 

从Kohana 3中,你如何找出在查询期间发生的错误? 。

设置Kohana :: $环境

将这些行粘贴到您的.htaccess

 SetEnvIf SERVER_ADDR "^(127\.0\.0\.1|::1)$" KOHANA_ENV=development SetEnvIf SERVER_ADDR "^((?!127\.0\.0\.1|::1).)*$" KOHANA_ENV=production 

现在,如果您位于本地主机上,则处于开发模式,否则您处于生产模式

编辑:添加了对IPv6的支持

this->request->route->uri()this->request->uri() (Kohana 3)

 // Current URI = welcome/test/5 // Using default route ":controller/:action/:id" // This returns "welcome/test/5" echo $this->request->uri(); // This returns "welcome/test1/5" echo $this->request->uri(array( 'action' => 'test1' )); // This returns "welcome/index" echo $this->request->route->uri(); // This returns "welcome/test1" echo $this->request->route->uri(array( 'action' => 'test1' )); 

正如你所看到的,$ this-> request-> route-> uri()使用当前的路由默认值(id为null),而$ this-> request-> uri()应用当前的uri段。

使用ORM将数据添加到数据透视表

ORMs add函数接受第三个参数,您可以在其中指定要保存在1pivot表1上的附加数据。

例如,如果用户具有多个angular色并且angular色拥有多个用户(通过名为1roles_users1的表),则可以通过将一列列键和数据值作为第三个parameter passing给add方法,将信息保存到1pivot表1中。

Kohana 3.1

不支持。 另一种方法是加载数据pivot table并像使用其他表一样添加数据。

Kohana 3.0

 $user->add('role', $role, array('date_role_added' => time())); 

$roleORM::factory('role', array('name' => 'user'));

closures对AJAX请求的auto_rendering

这些代码示例假定您正在从模板控制器扩展。

Kohana 3.1

 public function before() { parent::before(); if (Request::current()->is_ajax()) { $this->auto_render = FALSE; } } 

Kohana 3.0

 public function before() { parent::before(); if (Request::$is_ajax) { $this->auto_render = FALSE; } } 

可维护的路线

不要在HTML和PHP中对锚点进行硬编码,而是反向路由。 这基本上意味着您定义路线位置,然后使用这些位置; 如果你需要改变位置,那么在一个地方完成,而不是数百个。

可以在任何地方定义路由,但将它们放入应用程序引导程序或模块引导程序(init.php)是一种很好的做法。

它们设置如下:

 Route::set('name', '<controller>(/<action>)', array('action' => 'login|logout'); 
  1. 路由名称
  2. 匹配的URLpath。
  3. 一个正则expression式来限制<part>匹配的内容。

当零件被括号包围时,该零件是可选的。 如果用户没有提供零件,而您想要提供默认值,则使用默认方法指定值。

 ->defaults(array('action' => 'login')); 

Kohana 3.1和3.0

以下代码现在用于具有可逆路线。 urlpath可以更新,所有的url应该像以前一样工作。

 Route::url('name', array('controller' => 'user', 'action' => 'login')); 

自动设置base_url

 Kohana::init(array( // ... 'base_url' => dirname($_SERVER['SCRIPT_NAME']), // ... )); 

如果您的网站托pipe在1和1,您应该使用:

 Kohana::init(array( // ... 'base_url' => substr($_SERVER["SCRIPT_NAME"], 0, strpos($_SERVER["SCRIPT_NAME"], basename($_SERVER["SCRIPT_FILENAME"]))); // ... )); 

(取自Gallery3configuration文件 )

检查内部请求

这些被称为子请求。 看看Sam de Freyssinets的文章: 使用HMVC来扩展Web应用程序,以获得更深入的解释。 注意版本之间的初始vs实例差异。

Kohana 3.1

 if (Request::initial() !== Request::current()) { print 'Internal called made with Request::factory'; } 

Kohana 3.0

 if (Request::instance() !== Request::current()) { print 'Internal called made with Request::factory'; } 

HMVC + AJAX = is_remote()

这个函数同时检查内部和AJAX请求。 如果页面的某些部分最初使用HMVC技术加载,然后可以使用AJAX重新加载,可能会很方便。 放置一些基础控制器,从中扩展所有适当的控制器(我称之为“基础控制器”):

 public function is_remote() { if ($this->request->is_initial()) { if ($this->request->is_ajax()) { return TRUE; } else { return FALSE; } } else { return TRUE; } } 

一个较短的(等价的)写这个的方法:

 public function is_remote() { return ( ! $this->request->is_initial() || $this->request->is_ajax()); } 

希望这可以帮助。

显示错误页面

如果你需要显示一个错误页面,Kohana已经build立了一个例外。 一旦引发exception,您可以创build自定义exception处理程序并显示HTML错误页面。 您将需要一个开关来显示开发中的真实错误。

Kohana 3.1

 throw new HTTP_Exception_404('The article :article was not found', array(':article' => $article->name)); 

第二个参数为您提供了一种replace错误消息中的string的方法。

Kohana 3.0

没有捆绑HTTPexception。 你应该创build自己的例外,并处理它们。 Kohana有一个这样的教程: Kohana – 自定义错误页面

要使用预处理语句执行像TRUNCATE mytable这样的SQL查询, TRUNCATE mytable第一个parameter passing给DB::query()方法。 有用的,当查询不适合任何CRUD操作。