Как реализовать Slim v2 hook как промежуточное ПО в Slim v3

В Slim Framework v2 я использую простую функцию аутентификации в качестве ловушки, чтобы проверить, требуется ли для входа логин.

Это код аутентификации:

$authenticate = function ( $app ) {
return function () use ( $app ) {
if ( !isset( $_SESSION['userid'] ) ) {
$_SESSION['urlRedirect'] = $app->request()->getPathInfo();
$app->flash('danger', 'You need to login');
$app->redirect('/login');
}
};
};

Вот как я использую в Slim v2:

$app->get("/user/change-password", $authenticate($app), function () use ( $app ) {

$userStuff->changePassowrd($_SESSION['userid'], $newPassword, $oldPassword);

});

Я могу реализовать это в Slim v3 без проблем, но я не могу понять, как я должен делать это с промежуточным ПО (для изучения и использования функционально)

Я пробовал это: это мой класс промежуточного программного обеспечения;

<?php
namespace entity;

use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Message\ResponseInterface;

class Auth
{
/**
* Example middleware invokable class
*
* @param  \Psr\Http\Message\ServerRequestInterface $request  PSR7 request
* @param  \Psr\Http\Message\ResponseInterface      $response PSR7 response
* @param  callable                                 $next     Next middleware
*
* @return \Psr\Http\Message\ResponseInterface
*/
public function __invoke($request, $response, $next)
{
if ($this->authenticate()) {
$response = $next($request, $response);
} else {
echo 'You need to login';
}
return $response;
}

public function authenticate() {
if ( !isset( $_SESSION['userid'] ) ) {
return true;
}
return false;
}
}

?>

Зарегистрировано это:

$app->add( new entity\Auth() );

и я не знаю, как использовать это на маршруте, как я делал в Slim v2, где я могу добавить это в маршрут, чтобы проверить, нуждается ли этот маршрут в аутентификации?

Благодарю.

1

Решение

То, что вы ищете, на самом деле исключает маршрут для Auth промежуточное программное обеспечение.
Вы хочу что проверить для всех других маршрутов, но не для changePassword,

В вашем __invoke вам нужно получить текущий маршрут и только делать authenticate если маршрут не changePassword (если это название вашего маршрута).

public function __invoke($request, $response, $next)
{
$route = $request->getAttribute('route');
if (in_array($route->getName(), ['changePassword']) || $this->authenticate()) {
$response = $next($request, $response);
} else {
echo 'You need to login';
}
return $response;
}
1

Другие решения

Ну основной пример следующий

<?php

require 'vendor/autoload.php';

session_start();

class Auth {
public function __invoke($request, $response, $next) {
if ($this->authenticate()) {
$response = $next($request, $response);
} else {
echo 'You need to login';
}
return $response;
}

public function authenticate() {
if (isset($_SESSION['userid'])) {
return true;
}
return false;
}
}

$app = new \Slim\App();

$app->get('/open', function($request, $response, $args){
echo 'HAPPINESS FOR EVERYBODY, FREE, AND LET NO ONE BE LEFT BEHIND!';
});

$app->get('/closed', function($request, $response, $args){
echo 'You are authenticated!';
})->add(new Auth());

$app->get('/login', function($request, $response, $args){
$_SESSION['userid'] = 1;
});

$app->run();

Я думаю, что была ошибка в authenticate функционировать как !isset значит нет $_SESSION['userid'] и, вероятно, пользователь не вошел в систему, и ваша функция сообщает, что он вошел.

Но в любом случае вы можете добавить промежуточное ПО для отдельного маршрута или группы маршрутов с add() метод.

1

По вопросам рекламы [email protected]