Функция возврата внутри анонимной функции. Почему?

1

Учитывая этот пример из 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');
    }
};

Разве эти функции не одинаковы?

  • 0
    Должен ли я закрыть свой аккаунт, чтобы спросить это?
Теги:

1 ответ

1
Лучший ответ

В контексте тонкой структуры и промежуточного программного обеспечения и конкретного примера связан этот вопрос.

Логика завершается замыканием, поэтому ее можно вызвать в дальнейшем по логике промежуточного программного обеспечения и сохранить аргумент пользователя для $ role.

для справки и контекста - Код использования для исходного сообщения

$app->get('/foo', $authenticateForRole('admin'), function () {
//Display admin control panel
});

понимая вызывающий контекст, вы должны понять, почему эти две разные.

с этого момента, когда вы ссылаетесь на второй код, который вы указали, я буду ссылаться на него как $ authenticateForRole2 в коде.


case 1 - Fail

Использование второго кода, как показано ниже: приведет к немедленному выполнению функции $ authenticateForRole2, возвращаемое значение (null) будет передано как аргумент middlewere. Предполагается, что аргумент "middlewere" является вызываемым /invokable объектом, и именно поэтому этот код является неправильным.

$app->get('/foo', $authenticateForRole2('admin'), function () {
//Display admin control panel
});

случай 2 - lambada без контроля над $ role (~ Works)

Частично работает, а не на 100% одинаковой функциональности, он будет использовать роль $ по умолчанию, установленную в объявлении функции. И вы не можете предоставить другой параметр $ role при определении api (настройка путей)

$app->get('/foo', $authenticateForRole2, function () {
//Display admin control panel
});

случай 3 - повторение декларации (работает, но не рекомендуется)

Это должно работать, но потребует повторения декларации для каждого значения $ 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
});

случай 4 (оригинальный пример)

В исходном примере используется трюк для укупорки закрытия, чтобы обеспечить метод DRY для метода проверки подлинности ролей.

$app->get('/foo', $authenticateForRole('admin'), function () {
//Display admin control panel
});  

$app->get('/bar', $authenticateForRole('member'), function () {
//Display member control panel
});
  • 0
    почему простая функция не может быть вызвана позже?
  • 0
    Извините, но я все еще не понимаю, почему authenticateForRole () не может быть нормальной функцией вместо анонимной функции, которая возвращает другую анонимную функцию. Не могли бы вы объяснить немного больше своего ответа?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню