如何管理我的 Slim 应用程序中的错误?

How to manage errors within my Slim application?

我不确定我应该如何处理 Slim 中的错误。

我正在使用带有功能的 class,例如登录。当用户输入错误的密码时,我不确定如何将它们提供给 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.
    }
});

Class函数:

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

我如何使用 cookie:

$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 功能,但目前还没有用。

编辑:

我误解了这个问题,我认为你正在寻找的是一个简单的 try catch 结构,它定义了你的自定义异常。

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

更新

来自documentation

If you use the session cookie middleware, you DO NOT need to start a native PHP session.

使用\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:

index.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>Whosebug 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>

旧答案

你的问题应该是connected to the PHP session。您必须将其设置在您的文件之上:

session_start();