2015-10-17 2 views
1

Я не уверен, как я должен обрабатывать ошибки внутри Slim.Как управлять ошибками в моем Slim-приложении?

Я использую класс с функциями, например. авторизоваться. Когда пользователь вводит неверный пароль, я не уверен, как предоставить их Slim, чтобы они могли отображаться пользователю.

Это то, что я в настоящее время:

Маршрут: функция

$app->post('/submit', function() use ($app) { 
    $post = (object) $app->request->post(); 

    if($app->user->login($post->log_mail, $post->log_pass)){ 
     $app->setCookie('mail', $post->log_mail, '2 minutes'); 
     $app->redirect('/inbox'); 
    }else{ 
     // redirect 
     // display errors set by the $app->user->login() function. 
    } 
}); 

Класс:

public function login($username, $password){ 
    if(!empty($username)){ 
     if(!empty($password)){ 

      if($this->numrows($username, $password)){ 

       // login success 
       return true; 


      }else{die('credentials');} 

     }else{die('password');} 
    }else{die('username');} 
} 

Как использовать печенье:

$app = new \Slim\Slim(
[ 
    'debug' => true, 
    'mode' => 'development', 
    'cookies.encrypt' => true, 
    'cookies.secret_key' => 'supersecret', 
]); 
$app->setCookie('something', 'something' '2 minutes'); 

Где я я в настоящее время использую die(), я хотел бы установить фактическую ошибку, чтобы представление Slim могло ее отображать. Я просмотрел функцию Slim Flash, но пока не работает.

+0

Какая версия Slim вы используете? –

+0

Slim 2 Я считаю, что я заметил, что теперь есть третий, но еще не обновлен – Pepzter9

ответ

1

UPDATE

Из documentation:

Если вы используете куки сессии промежуточное программное обеспечение, вам не нужно, чтобы начать родной PHP сессии.

Использование \Slim\Middleware\SessionCookie, код будет:

$app = new Slim(); 
$app->add(new \Slim\Middleware\SessionCookie(array(
    'expires' => '20 minutes', 
    'path' => '/', 
    'domain' => null, 
    'secure' => false, 
    'httponly' => false, 
    'name' => 'slim_session', 
    'secret' => 'CHANGE_ME', 
    'cipher' => MCRYPT_RIJNDAEL_256, 
    'cipher_mode' => MCRYPT_MODE_CBC 
))); 

Это мой рабочий раствор, без использования \Slim\Middleware\SessionCookie:

индекс.PHP

<?php 
require 'vendor/autoload.php'; 
session_start(); 

// Twig 
$twigView = new \Slim\Views\Twig(); 

$twigView->parserExtensions = array(
    new \Slim\Views\TwigExtension() 
); 

$app = new \Slim\Slim(
[ 
    'debug' => true, 
    'mode' => 'development', 
    'cookies.encrypt' => true, 
    'cookies.secret_key' => 'supersecret', 
    'view' => $twigView 
]); 
$app->setCookie('something', 'something', '2 minutes'); 

class User { 

    private function numRows($username, $password){ 
     //Your magic here 
     return true; 
    } 

    public function login($username, $password){ 
     $app = \Slim\Slim::getInstance(); 
     if(!empty($username)){ 
      if(!empty($password)){ 

       if($this->numrows($username, $password)){ 
        // login success 
        return true; 
       }else{ 
        $app->flash('error', 'credentials'); 
       } 

      } else{ 
       $app->flash('error', 'password'); 
      } 
     } else{ 
      $app->flash('error', 'username'); 
     } 
     return false; 
    } 
} 

//Inject the new user 
$app->user = new User(); 

$app->get('/', function() use ($app){ 
    $flash = $app->view()->getData('flash'); 
    $app->render('form.html'); 
})->name('Login'); 

$app->get('/inbox', function() use ($app){ 
    echo "Login OK"; 
})->name('Inbox'); 


$app->post('/submit', function() use ($app) { 
    $post = (object) $app->request->post(); 
    if($app->user->login($post->log_mail, $post->log_pass)){ 
     $app->setCookie('mail', $post->log_mail, '2 minutes'); 
     $app->redirect($app->urlFor('Inbox')); 
    }else{ 
     // redirect 
     // display errors set by the $app->user->login() function. 
     $app->redirect($app->urlFor('Login')); 
    } 
}); 

$app->run(); 

form.html

<html> 
<head> 
    <title>Stackoverflow 33192640</title> 
</head> 

<body> 
    <form action="./submit" method="POST"> 
     <input type="text" name="log_mail"> 
     <input type="password" name="log_pass"> 
     <button type="submit">Login</button> 
    </form> 
    {% if flash.error %} 
     Error: {{ flash.error }} 
    {% endif %} 
</body> 
</html> 

OLD ANSWER

Ваша проблема должна быть connected to the PHP session. Вы должны установить его поверх своего файла:

session_start(); 
+0

Нет, я использую cookie Slim менеджер, поэтому мне не требуется вручную запускать сеанс PHP. Использование $ app-> flash не работает для меня. – Pepzter9

+0

Как вы его используете? Обновите свой вопрос с помощью кода менеджера файлов cookie Slim. –

+0

Обновлено. См. Главный вопрос – Pepzter9

0

EDIT:

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

class LoginException extends Exception 
{ 
    public function __construct($message, $code = 0, Exception $previous = null) { 
     parent::__construct($message, $code, $previous); 
    } 

    public function __toString() { 
     return __CLASS__ . ": [{$this->code}]: {$this->message}\n"; 
    } 
} 

С кодом, похожим на этот.

public function login($username, $password){ 
    if(!empty($username)){ 
     if(!empty($password)){ 

      if($this->numrows($username, $password)){ 

       // login success 
       return true; 


      }else{ throw new CustomException('Login error', 1);} 

     }else{throw new CustomException('password error', 2);} 
    }else{throw new CustomException('username error', 3);} 
} 

try { 
if($app->user->login($post->log_mail, $post->log_pass)){ 
     $app->setCookie('mail', $post->log_mail, '2 minutes'); 
     $app->redirect('/inbox'); 
    } 
} catch (CustomException $e) { 
    // Handle the different codes 
} 

Здесь вы определяете исключение, в котором вы указываете сообщение и код, это будет представлять собой вашу различную ситуацию с ошибкой. Знайте, что вы можете обрабатывать их по-разному в коде, и когда они происходят, вы просто бросаете исключение с соответствующим кодом.


То, что вы ищете, вызывая собственные ошибки, как описано на http://docs.slimframework.com/errors/500/.

Поднятие пользовательской ошибки будет выглядеть примерно так. Где вы можете ссылаться на шаблоны с пользовательскими ошибками и так далее. Там нет необходимости в логике if else в разделе отправки.

$app->error(function (\Exception $e) use ($app) { 
    DoSomethingElse(); 
    $app->render('mycustomerror.php'); 
}); 
+0

Не будет ли отображаться ошибка уровня приложения? Я пытаюсь дать пользователю стилизованное сообщение с сообщением о чем-то вроде «Неверный пароль», я понял, что $ app-> flash() работает var_dump() весь массив, однако в настоящее время у меня возникают проблемы с отображением одной ошибки флэш-памяти , Причина, по которой я использую оператор if в функции класса, заключается в том, чтобы проверить, возвращается ли она true или нет, if (возвращает true) {// что-то делает} else {отображаемая ошибка} – Pepzter9

+0

Это то, что я в настоящее время пробовал: $ app-> flash ('error', 'wrong!'); $ flash = $ app-> view() -> getData ('flash'); print $ flash ['error']; // ничего (довольно уверен, что по какой-то причине это повторное значение NULL) var_dump ($ flash); // это сбрасывает все данные, я также вижу сообщение об ошибке, доступное внутри этого. – Pepzter9

+0

Обновлен ответ –

Смежные вопросы