如何在所有Silex路线DRY / global中包含功能?

时间:2015-03-05 22:58:35

标签: php symfony routes silex

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

$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;

也是如此

3 个答案:

答案 0 :(得分:3)

这可能最适合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

答案 1 :(得分:1)

首先 - 您最好使用composer自动加载而不是require / include,并将辅助函数重构为具有显式依赖关系的类或多个类,而不是使用在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)。

答案 2 :(得分:0)

我所做的只是在控制器顶部的名为user = User.find_by_email(params[:email]) helpers.php的文件中定义函数。

现在我可以调用任何required内的任何函数,也只是记住使函数尽可能独立,以便不依赖于范围之外的任何变量。任何需要的东西都可以作为参数传递。

这些只是简单的好的函数,而不是扩展的route方法或其他任何东西。