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