2016-05-10 10 views
0

Я новый пользователь Slim framework, у меня есть простое приложение Slim 3 со знаком и подтверждением регистрации. Но я не уверен, что это правильный/лучший способ установить ошибки и проверить, вошел ли пользователь в систему. Чтобы перенаправить его на свою учетную запись, если существует сеанс user.id.Slim3 верный способ установить ошибки и проверить, зарегистрирован ли пользователь в

Я использовал промежуточное программное обеспечение: 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 для моих взглядов. Session validation назначен в validator.php, который включает в себя:

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); 
} 
} 

Использование Respect\Validation. Кроме того, это правильное использование Middlewares?

Заранее спасибо.

ответ

1

попробуйте создать отдельный файл для методов, и назвав его от промежуточного программного обеспечения:

<?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; 
     } 
    } 

Не забудьте включает класса Auth в ваших $ приложения:

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