实现帮助函数的有效方法?

时间:2016-07-28 16:37:31

标签: php frameworks helpers psr-4

我正在尝试实施一个辅助功能,这有助于我添加'添加' 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']);

我宁愿简单地将root添加到我的文件中......

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

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

问题

感谢psr-4自动加载,我知道如何在需要的时候引入类,但是 这对于平面旧函数 来说不太清楚。如何在不向所有地方添加require文件的情况下将我的帮助函数干净地添加到我的MVC框架中?

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

2 个答案:

答案 0 :(得分:4)

要在全局范围内使用辅助功能,您必须全局包含它们。一种方法是在您的应用程序入口点(通常为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()之类的内容,并将函数保留在全局名称空间之外。

答案 1 :(得分:1)

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

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

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

您甚至可以使用所有功能,将它们组合成一个类作为静态方法,然后使用Libraryname::functionname()简单地调用它们,然后当您使用它时,自动加载器将为您处理所有事情,就像任何其他课程。

总结一下,没有自动加载器,但有许多好的,可靠的,干净的选项可以让这项工作。