【问题标题】:Effective ways to implement helper functions?实现辅助功能的有效方法?
【发布时间】:2016-07-28 16:37:30
【问题描述】:

我正在尝试实现一个辅助函数,它可以帮助我在 MVC 应用程序中“添加”路由(映射到控制器/动作)。

我的 index.php 文件如下所示。

//  use block
use App\Router;
use App\Config;
use App\Core\Database;
use App\Bootstrap;

// dependencies
$router    = new Router;
$config    = new Config;
$database  = new Database($config);
$bootstrap = new Bootstrap($router, $database);

// routes
require '../App/Routes.php';


$bootstrap->router->dispatch($_SERVER['QUERY_STRING']);

我的“路线”文件中有一条路线,我的路线如下所示。

$bootstrap->router->add('/home', ['controller' => 'home', 'action' => 'index']);

我宁愿像这样简单地将根添加到我的文件中......

route('/home', ['controller' => 'home', 'action' => 'index']);

所以我需要做一个辅助函数

问题

感谢 psr-4 自动加载,我知道如何在需要时提取类,但是 对于平面旧函数,这一点不太清楚。我怎样才能干净地将我的帮助函数添加到我的 MVC 框架中,而不需要到处添加需要文件?

非常感谢您的时间和考虑!

【问题讨论】:

    标签: php frameworks helpers psr-4


    【解决方案1】:

    要让辅助函数在全局范围内可用,您必须在全局范围内包含它们。一种方法是在您的应用程序入口点(通常为index.php)中,您需要具有帮助函数的文件。

    例如,Laravel 就是这样做的,并且有各种各样的助手:https://laravel.com/docs/5.1/helpers

    每当我为学习目的编写自己的框架时,我发现我喜欢将助手分成功能区域,所以我倾向于为助手创建一个文件夹,例如 /app/helpers 并使用一点在我的入口点中有这样的代码:

    foreach (glob("./app/helpers/*.php") as $helper) {
        require_once($helper);
    }
    

    请注意,这会污染全局命名空间,因此对您的命名约定要非常小心和深思熟虑。

    另一种方法是创建一个Helper 类并在其中静态提供可用的方法,这样您就可以调用诸如Helper::route() 之类的东西,并且它将函数排除在全局命名空间之外。

    【讨论】:

    • 哦,伙计,这是一个很好的答案,如此清晰和有帮助,首先是学习了一点 laravel 才引发了这个问题,很高兴知道!
    【解决方案2】:

    正如Autoloader for functions 所述,您有几个选择,因为没有自动加载功能。

    如果您使用 composer 来管理您的依赖项,您可以将所有函数放在一个文件中,并将 "files" 指令添加到您的 "autoload" 文件的 composer.json 部分。这将导致作曲家在它生成的自动加载器中为你做脏活。

    除此之外,您可以将包含您的函数的文件的require_once 放入您的框架的 index.php 中,然后离开。

    你甚至可以把你所有的函数,作为静态方法组合成一个类,然后简单地使用Libraryname::functionname()调用它们,然后当你使用它时,自动加载器会像处理任何其他类一样为你处理所有事情.

    回顾一下,没有自动加载器,但有很多好的、可靠、干净的选项可以让这项工作发挥作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多