最喜欢的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()));
$role
是ORM::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');
- 路由名称
- 匹配的URLpath。
- 一个正则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操作。