如何在所有 Silex 路由 DRY / global 中包含函数?

how to include functions within all Silex routes DRY / global?

我想在我的所有路由中包含一个文件和一个变量,例如

$app->get('/', function() use ($app) {

$auth='code';
require __DIR__.'/assets/helpers.php';

....

});

$app->get('login', function() use ($app) {

$auth='code';    
require __DIR__.'/assets/helpers.php';

....

});

我需要在每个路由声明中重复代码。将变量或重定向放在文件顶部不会将其包含在 $app 范围内,即使设置 global $auth;

这可能最好用 route middleware 完成:

use Silex\Application;
use Symfony\Component\HttpFoundation\Request;

$app = new Application();

$setup = function (Request $request) use ($app) {
    $auth='code';
    require __DIR__.'/assets/helpers.php';
};

$app->get('/', function() use ($app) {})
    ->before($setup);

$app->get('/login', function() use ($app) {})
    ->before($setup);

我唯一不确定的是这是否会给您带来范围问题。例如,如果您的助手依赖于可能在您的控制器闭包内建立的其他一些变量,那么这可能不起作用。但那时我认为它在设计中有点难闻,你可能应该将这些东西抽象成 Service Providers

首先 - 你最好使用 composer autoloading 而不是 require/include,并将你的辅助函数重构为一个 class 或多个具有显式依赖关系的 classes 而不是使用在 helpers.php

之外定义的 $auth 变量

如果您在 所有 路由之前需要一些通用代码 - 您可以使用 $app->before() 中间件,如 mTorres 所述。

当在 一些 路由之前需要通用代码时 - 我使用以下方法:

use Silex\Application;
use Symfony\Component\HttpFoundation\Request;

$app = new Application();

array_map(
    function($route) {
        $route->before(function(Request $request, Application $app){
            // common code goes here
        })
    },
    array (
        $app->get('/', function() use ($app) {}),
        $app->get('/login', function() use ($app) {})
    )
);

这种方法还可以避免创建包含可调用中间件的全局变量(例如,prodigitalson 提供的示例中的 $setup)。

我所做的只是在一个名为 helpers.php 的文件中定义函数,并且只是在控制器顶部的 required 中。

现在我可以在任何 route 中调用任何函数,同时记得让函数尽可能独立,以免依赖 scope.Anything 之外的任何变量需要的可以作为参数传递。

此外,这些只是普通的好函数,并没有扩展 Class 方法或其他任何东西。