我想在我的所有路线中包含一个文件和一个变量,例如。
$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;
答案 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
方法或其他任何东西。