【问题标题】:Kohana 3: How to provide API functions in template/view like WordPress?Kohana 3:如何像 WordPress 一样在模板/视图中提供 API 功能?
【发布时间】:2011-04-24 15:09:55
【问题描述】:

我正在开发一个项目,该项目允许高级用户定义自己的信息显示方式并访问一些基本 API。比如我提供了一个show_search_box()函数,这样用户可以在需要显示标准搜索框的时候在视图文件中调用这个函数,也可以带参数调用这个函数来自定义搜索表单。

例如模板中的此代码将显示带有水印文本“在此处输入关键字”的搜索表单。

<div><?php show_search_box('Enter keyword here'); ?></div>

我的想法实际上与 WordPress 在其模板标签中所做的完全一样。 (http://codex.wordpress.org/Stepping_Into_Template_Tags)

我的想法是创建一个提供所有这些 API 函数的类,并将该类的对象实例传递给视图文件,以便用户可以在视图中调用 API 函数,如下所示:

<div><?php $API->show_search_box('Enter keyword here'); ?></div>

我认为它会起作用,(但尚未对其进行测试),但我更喜欢提供一组直接调用的函数,就像 WordPress 一样。使用 kohana 3 执行此操作的最佳方法是什么?

======更新:我已经测试了传递 $API 对象到视图的方法,它按预期工作。

class API {
     public function show_search_box($watermark){....}
}

在控制器中,将 $API 传递给视图/模板

public function action_index()
{
     $this->template->API = new API();
}

然后如上所述调用视图/模板中的函数。 与那些控制器方法不同,$API 不能访问控制器的变量,除非它们被显式分配:例如$API->setVar('VarName', $a_controller_variable),我觉得这很乏味。

【问题讨论】:

    标签: api templates function view kohana


    【解决方案1】:

    嗯,与 Kohana 2.3 不同,视图不在控制器命名空间中执行,因此您不能简单地执行 $this-&gt;something()

    如果您在一个模型中拥有所有功能,我们称之为API,那么您可以在视图中执行此操作(或者如果您希望它在任何地方都可用,则可以在基本控制器中执行此操作...

    $this->template->internalView = View::factory('your_view')
                                      ->set('API', Model::factory('API));
    

    (假设您在父视图中有 &lt;?php echo $internalView; ?&gt;)。

    那么你可以在你的视野中做......

    <div><?php $API->show_search_box('Enter keyword here'); ?></div>
    

    它将在您的模型上运行您的方法。视图不应该真正了解模型的存在,但您的情况 ma 是一个例外。如果您担心破坏 MVC 范式,也许您可​​以使用辅助类而不是模型。

    如果你想做 WordPress 所做的事情(有一堆全局函数,我推荐),那么你需要在某个地方定义它们。 Kohana 并没有一个方便的位置来放置它们,因为它并不能真正满足一堆全局函数的需求。

    【讨论】:

    • 已经测试了按预期工作的“帮助类”方法,我想我会去的。谢谢你的建议。使用全局函数会使模板更直观:比较 show_search_box(...) 和 $API->show_search_box(...),没有强大编程背景的用户一般会问“$API”是什么。
    • +1 用于 OOP 助手。 @LazNiko 我认为具有强大编程背景的开发人员可能会问“为什么这家伙留下了一堆全局函数而不使用 OOP”?我想这是 PHP 拥有这么多全局函数的错误(但现在他们意识到这是错误的,并且正在将所有这些函数移动到类中)。那些家伙从 Python 中学到了一些东西,呵呵。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-27
    • 1970-01-01
    • 1970-01-01
    • 2017-06-12
    • 1970-01-01
    相关资源
    最近更新 更多