Учитывая этот пример из Slim PHP, который используется в качестве промежуточного программного обеспечения.
Какая разница между этим,
$authenticateForRole = function ( $role = 'member' ) {
return function () use ( $role ) {
$user = User::fetchFromDatabaseSomehow();
if ( $user->belongsToRole($role) === false ) {
$app = \Slim\Slim::getInstance();
$app->flash('error', 'Login required');
$app->redirect('/login');
}
};
};
и это,
$authenticateForRole = function ( $role = 'member' ) {
$user = User::fetchFromDatabaseSomehow();
if ( $user->belongsToRole($role) === false ) {
$app = \Slim\Slim::getInstance();
$app->flash('error', 'Login required');
$app->redirect('/login');
}
};
Разве эти функции не одинаковы?
В контексте тонкой структуры и промежуточного программного обеспечения и конкретного примера связан этот вопрос.
Логика завершается замыканием, поэтому ее можно вызвать в дальнейшем по логике промежуточного программного обеспечения и сохранить аргумент пользователя для $ role.
для справки и контекста - Код использования для исходного сообщения
$app->get('/foo', $authenticateForRole('admin'), function () {
//Display admin control panel
});
понимая вызывающий контекст, вы должны понять, почему эти две разные.
с этого момента, когда вы ссылаетесь на второй код, который вы указали, я буду ссылаться на него как $ authenticateForRole2 в коде.
Использование второго кода, как показано ниже: приведет к немедленному выполнению функции $ authenticateForRole2, возвращаемое значение (null) будет передано как аргумент middlewere. Предполагается, что аргумент "middlewere" является вызываемым /invokable объектом, и именно поэтому этот код является неправильным.
$app->get('/foo', $authenticateForRole2('admin'), function () {
//Display admin control panel
});
Частично работает, а не на 100% одинаковой функциональности, он будет использовать роль $ по умолчанию, установленную в объявлении функции. И вы не можете предоставить другой параметр $ role при определении api (настройка путей)
$app->get('/foo', $authenticateForRole2, function () {
//Display admin control panel
});
Это должно работать, но потребует повторения декларации для каждого значения $ role. например, если один путь для "admin", а другой для "члена",
note. Я переместил $ role внутри функции, потому что slim передает объект в качестве аргумента функции middlewere, когда он вызывается.
$app->get('/foo',
function() {
$role = 'admin'
$user = User::fetchFromDatabaseSomehow();
if ( $user->belongsToRole($role) === false ) {
$app = \Slim\Slim::getInstance();
$app->flash('error', 'Login required');
$app->redirect('/login');
}
} , function () {
//Display admin control panel
});
$app->get('/bar',
function (){
$role = 'member'
$user = User::fetchFromDatabaseSomehow();
if ( $user->belongsToRole($role) === false ) {
$app = \Slim\Slim::getInstance();
$app->flash('error', 'Login required');
$app->redirect('/login');
}
} , function () {
//Display admin control panel
});
В исходном примере используется трюк для укупорки закрытия, чтобы обеспечить метод DRY для метода проверки подлинности ролей.
$app->get('/foo', $authenticateForRole('admin'), function () {
//Display admin control panel
});
$app->get('/bar', $authenticateForRole('member'), function () {
//Display member control panel
});