Slim3设置错误和检查的正确方法是用户登录


Slim3 right way to set errors and check is user logged in

我是Slim框架的新用户,我有一个简单的Slim 3应用程序,具有登录和注册验证功能。但我真的不确定这是否是设置错误和检查用户是否登录的正确/最佳方式——如果会话user.id存在,为了将其重定向到他的帐户。

我使用了一个中间件:AuthMiddleware,其中包括:

class AuthMiddleware
{
protected $container;
public function __construct($container)
{
    $this->container = $container;
}
public function __invoke($request, $response, $next)
{
    if (isset($_SESSION['user.id']) && !empty($_SESSION['user.id'])) {
        return $response->withRedirect($this->container->router->pathFor('user.index'));
    }
    $twig = $this->container->view->getEnvironment();
    if (isset($_SESSION['validation'])) {
        $twig->addGlobal('errors', $_SESSION['validation']['errors']);
        $twig->addGlobal('values', $_SESSION['validation']['values']);
        unset($_SESSION['validation']);
    }
    if (isset($_SESSION['auth.signup.success'])) {
        $twig->addGlobal('auth_signup_success', $_SESSION['auth.signup.success']);
        unset($_SESSION['auth.signup.success']);
    }
    if (isset($_SESSION['auth.signin.failed'])) {
        $twig->addGlobal('auth_signin_failed', $_SESSION['auth.signin.failed']);
        unset($_SESSION['auth.signin.failed']);
    }
    $response = $next($request, $response);
    return $response;
}
}

我用Twig来表达我的观点。在validator.php中分配的会话validation,包括:

class Validator
{
protected $errors = [];
protected $values = [];
public function validate($request, $rules)
{
    foreach ($rules as $field => $rule) {
        $this->values[$field] = $request->getParam($field);
        try {
            $rule->setName(ucfirst($field))->assert($request->getParam($field));
        } catch (NestedValidationException $e) {
            $this->errors[$field] = $e->getMessages()[0];
        }
    }
    if ($this->failed()) {
        $_SESSION['validation'] = [
            'errors' => $this->errors,
            'values' => $this->values,
        ];
    }
    return $this;
}
public function failed()
{
    return !empty($this->errors);
}
}

使用CCD_ 6。此外,这是Middlewares的正确使用吗?

提前谢谢。

尝试为方法创建一个单独的文件,并从中间件调用它:

<?php 
    class AuthMiddleware extends Middleware {
        public function __invoke($request, $response, $next) {
            if (!$this->container->auth->check()) {
                $this->container->flash->addMessage('danger', 'Please sign in to continue.');
            return $response->withRedirect($this->container->router->pathFor('auth.signin'));
            }
            $response = $next($request, $response);
            return $response;
        }
    }

而Auth类则需要检查以下方法:

<?php
    public function check () {
        return isset($_SESSION['user']);
    }
    public function user() {
        if (isset($_SESSION['user'])) {
            return User::find($_SESSION['user'])->first();
        } else {
            return false;
        }
    }

不要忘记在$app:中包含Auth

<?php 
    $container['auth'] = function ($container) {
        return new 'App'Auth'Auth();
    };