61

受到其他社区 wiki 的启发,我有兴趣了解鲜为人知的 Kohana 提示、技巧和功能。

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

这是一个社区维基

4

12 回答 12

23

从数据库结果生成 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);
于 2010-08-01T12:04:21.957 回答
17

显示最后执行的查询

Kohana 3.1 和 3.0

echo Database::instance()->last_query

取自In Kohana 3,您如何找出查询期间出现的错误?.

于 2010-03-09T14:49:53.410 回答
17

设置 Kohana::$environment

将这些行粘贴到您的.htaccess

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

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

编辑:增加了对 IPv6 的支持

于 2011-06-03T18:42:15.347 回答
15

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 为空),而 $this->request->uri() 应用当前 uri 段。

于 2010-03-11T08:43:21.673 回答
15

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

ORMsadd函数接受第三个参数,您可以在其中指定要保存在 1pivot table1 上的其他数据。

例如,如果一个用户有很多角色并且一个角色有很多用户(通过名为 1roles_users1 的表),您可以通过将列键和数据值数组作为第三个参数传递给该add方法,将信息保存到 1pivot table1。

小花 3.1

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

小花3.0

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

$role哪里ORM::factory('role', array('name' => 'user'));

于 2010-03-08T18:37:56.180 回答
12

关闭 AJAX 请求的 auto_rendering

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

小花 3.1

public function before()
{
    parent::before();

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

小花3.0

public function before()
{
    parent::before();

    if (Request::$is_ajax)
    {
      $this->auto_render = FALSE;
    }
}
于 2010-09-27T13:56:03.407 回答
11

可维护的路线

与其在 HTML 和 PHP 中硬编码锚位置,倒不如反向路由。这实质上意味着您定义路线位置,然后使用它们;如果您需要更改位置,它可以在一个地方完成,而不是数百个。

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

它们设置如下:

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

当一个部分被括号包围时,该部分是可选的。如果用户没有提供部件并且您想提供默认值,则使用 defaults 方法指定值。

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

Kohana 3.1 和 3.0

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

Route::url('name', array('controller' => 'user', 'action' => 'login'));
于 2010-03-19T00:29:25.450 回答
9

Set base_url automatically:

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

If your site is hosted at 1&1, you should use:

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

(taken from Gallery3 config file )

于 2011-06-03T19:17:51.893 回答
9

检查内部请求

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

小花 3.1

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

小花3.0

if (Request::instance() !== Request::current())
{
    print 'Internal called made with Request::factory';
}
于 2010-03-06T15:59:45.987 回答
7

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());
}

希望这可以帮助。

于 2011-05-31T19:09:45.650 回答
6

显示错误页面

如果您需要显示错误页面,Kohana 已经为它内置了异常。抛出异常后,您可以创建自定义异常处理程序并显示 HTML 错误页面。您需要一个开关来显示开发中的真正错误。

小花 3.1

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

第二个参数为您提供了一种替换错误消息中的字符串的方法。

小花3.0

没有捆绑 HTTP 异常。您应该创建自己的异常并处理它们。Kohana 有一个教程:Kohana - 自定义错误页面

于 2011-05-22T19:13:47.923 回答
4

TRUNCATE mytable要像使用准备好的语句一样执行 SQL 查询,请将null其作为第一个参数传递给DB::query()方法。当查询不适合任何 CRUD 操作时很有用。

于 2012-01-20T11:54:43.793 回答