【问题标题】:Favourite Kohana Tips & Features? [closed]最喜欢的 Kohana 提示和功能? [关闭]
【发布时间】:2011-01-24 11:36:08
【问题描述】:

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

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

这是一个社区维基

【问题讨论】:

    标签: php kohana kohana-3 kohana-orm kohana-3.3


    【解决方案1】:

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

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

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

    Kohana 3.1

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

    Kohana 3.0

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

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

    【讨论】:

    • 已经学到了一些新东西。谢谢。
    • 你也可以通过在模型中定义 $_created_column 来做到这一点:)
    • @Kemo;不在数据透视表上(除非您为它们定义了模型)。 @杜桑;您如何从枢轴读取数据?我还没有找到使用 ORM 的方法。
    • @Luke $table->pivots->select('pivots.field')->find_all() ? :)
    • @Luke 我还没有找到使用 ORM =(
    【解决方案2】:

    检查内部请求

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

    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';
    }
    

    【讨论】:

    • 或者现在你可以使用 $this->request->is_initial() 来检查。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      自动设置base_url

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

      如果您的网站托管在 1&1,您应该使用:

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

      (取自Gallery3 config file

      【讨论】:

        【解决方案5】:

        设置 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 的支持

        【讨论】:

          【解决方案6】:

          从数据库结果生成 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)。有关详细信息,请参阅database results 信息。

          如果要添加默认选项:

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

          【讨论】:

            【解决方案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());
            }
            

            希望这会有所帮助。

            【讨论】:

              【解决方案8】:

              显示错误页面

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

              Kohana 3.1

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

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

              Kohana 3.0

              没有捆绑 HTTP 异常。您应该创建自己的异常并处理它们。 Kohana 有一个教程:Kohana - Custom Error Pages

              【讨论】:

                【解决方案9】:

                为 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;
                    }
                }
                

                【讨论】:

                • 最好使用Request::is_ajax(),而不是站点特定的正则表达式。 is_ajax() 检查“现在最流行的 JS 框架为 AJAX 调用设置的 X-Requested-With HTTP 请求标头”。并且可用于 KO2 和 KO3。
                • 其实那不是Request::$is_ajax吗?
                【解决方案10】:

                显示最后执行的查询

                Kohana 3.1 和 3.0

                echo Database::instance()->last_query
                

                取自In Kohana 3, how do you figure out errors made during a query?

                【讨论】:

                  【解决方案11】:

                  可维护的路线

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

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

                  它们的设置如下:

                  Route::set('name', '<controller>(/<action>)', array('action' => 'login|logout');
                  
                  1. 路线名称
                  2. 要匹配的 URL 路径。
                  3. 用于限制 &lt;part&gt; 匹配对象的正则表达式。

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

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

                  Kohana 3.1 和 3.0

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

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

                  【讨论】:

                  • 也许是另一个想法: URL::site(Route::get('route_name')->uri(array('controller' => 'somecontroller', 'arg' => 'somearg') ));
                  • 或者Route::url('route_name', array('param' =&gt; 'value')); 我还建议将链接传递给您的视图,而不是期望视图生成它们 - 有助于将逻辑排除在视图之外。
                  【解决方案12】:

                  this-&gt;request-&gt;route-&gt;uri()this-&gt;request-&gt;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 段。

                  【讨论】:

                    猜你喜欢
                    • 2010-10-07
                    • 2011-03-31
                    • 2010-11-29
                    • 2011-01-03
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2018-06-26
                    相关资源
                    最近更新 更多