实现辅助功能的有效方法?

Effective ways to implement helper functions?

我正在尝试实现一个辅助函数,它可以帮助我在 MVC 应用程序中进行 'add' 路由(映射到 controllers/actions)。

我的 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']);

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

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

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

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

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

问题

感谢 psr-4 自动加载,我知道如何在需要时引入 类,但是 当涉及到平面旧函数时,这不太清楚。我如何才能干净利落地将我的辅助函数添加到我的 MVC 框架中,而无需在任何地方添加 require 文件?

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

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

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

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

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

请注意,这会污染全局命名空间,因此请谨慎考虑您的命名约定。

另一种方法是创建一个 Helper class 并在其中静态提供方法,这样您就可以调用 Helper::route() 之类的东西,并且它使函数不在全局范围内命名空间。

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

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

除此之外,您只需将包含函数的文件的 require_once 放入框架的 index.php 中即可。

您甚至可以将所有函数作为静态方法组合到 class 中,然后使用 Libraryname::functionname() 简单地调用它们,然后当您使用它时,自动加载器将处理所有事情对你来说就像任何其他 class.

回顾一下,没有自动加载器,但有很多好的、可靠的、干净的选项可以使这项工作正常进行。