最喜欢的Kohana提示和功能?

The*_*per 61 php kohana kohana-3

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

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

这是一个社区维基.

Kem*_*emo 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);
Run Code Online (Sandbox Code Playgroud)

应该注意,这不仅限于ORM,可以用于所有数据库结果(它们都支持as_array).有关详细信息,请参阅数据库结果信息.

如果要添加默认选项:

$options = Arr::merge(array('Please select a value.'), $options);
Run Code Online (Sandbox Code Playgroud)


dus*_*san 17

显示上次执行的查询

Kohana 3.1和3.0

echo Database::instance()->last_query
Run Code Online (Sandbox Code Playgroud)

摘自In Kohana 3,您如何计算查询过程中出现的错误?.


Edy*_*Edy 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
Run Code Online (Sandbox Code Playgroud)

现在,如果您在localhost上,则处于开发模式,否则您处于生产模式

编辑:添加了对IPv6的支持


dus*_*san 15

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

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

例如,如果用户具有多个角色且角色具有许多用户(通过名为1roles_users1的表),则可以通过将列键和数据值数组作为方法的第3个参数传递,将信息保存到1pivot table1 add.

Kohana 3.1

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

Kohana 3.0

$user->add('role', $role, array('date_role_added' => time()));
Run Code Online (Sandbox Code Playgroud)

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


小智 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' ));
Run Code Online (Sandbox Code Playgroud)

如您所见,$ this-> request-> route-> uri()使用当前路由默认值(id为null),而$ this-> request-> uri()使用当前uri段.


fab*_*ian 12

关闭AJAX请求的auto_rendering

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

Kohana 3.1

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

    if (Request::current()->is_ajax())
    {
      $this->auto_render = FALSE;
    }
}
Run Code Online (Sandbox Code Playgroud)

Kohana 3.0

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

    if (Request::$is_ajax)
    {
      $this->auto_render = FALSE;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 最好使用`Request :: is_ajax()`,而不是特定于站点的正则表达式.`is_ajax()`检查"最常用的JS框架现在为AJAX调用设置的X-Requested-With HTTP请求头".并且可用于KO2和KO3. (6认同)
  • 实际上,不是那个`Request :: $ is_ajax`? (3认同)

ale*_*lex 11

可维护的路线

而不是在HTML和PHP中硬编码锚点位置,反向路由是个好主意.这实际上意味着您定义路线位置然后使用它们; 如果你需要改变它在一个地方而不是数百个地方完成的位置.

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

它们设置如下:

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

当零件被括号括起时,该零件是可选的.如果用户未提供零件而您想提供默认值,则使用defaults方法指定值.

->defaults(array('action' => 'login'));
Run Code Online (Sandbox Code Playgroud)

Kohana 3.1和3.0

以下代码现在用于具有可逆路由.可以更新URL路径,并且所有URL 都应该像以前一样工作.

Route::url('name', array('controller' => 'user', 'action' => 'login'));
Run Code Online (Sandbox Code Playgroud)

  • 或许另一个想法:URL :: site(Route :: get('route_name') - > uri(array('controller'=>'somecontroller','arg'=>'somearg'))); (5认同)
  • 或者也许是`Route :: url('route_name',array('param'=>'value'));`我还建议将链接传递给你的视图而不是期望视图制作它们 - 有助于保持逻辑不变的观点. (2认同)

The*_*per 9

检查内部请求

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

Kohana 3.1

if (Request::initial() !== Request::current())
{
    print 'Internal called made with Request::factory';
}
Run Code Online (Sandbox Code Playgroud)

Kohana 3.0

if (Request::instance() !== Request::current())
{
    print 'Internal called made with Request::factory';
}
Run Code Online (Sandbox Code Playgroud)

  • 或者现在您可以使用$ this-> request-> is_initial()来检查. (3认同)

Edy*_*Edy 9

base_url自动设置:

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

如果您的网站以1和1托管,则应使用:

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

(取自Gallery3配置文件)


roo*_*ays 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

一种较短(等效)的写作方式:

public function is_remote()
{
    return ( ! $this->request->is_initial() || $this->request->is_ajax());
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.


The*_*per 6

显示错误页面

如果您需要显示错误页面,Kohana已为其构建了例外情况.一旦抛出异常,就可以创建自定义异常处理程序并显示HTML错误页面.您需要一个开关来显示开发中的真实错误.

Kohana 3.1

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

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

Kohana 3.0

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