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

时间:2015-10-17 23:20:11

标签: php rest frameworks 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');}
}

我如何使用cookies:

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

2 个答案:

答案 0 :(得分:1)

<强>更新

来自documentation

  

如果您使用会话cookie中间件,则无需启动   本机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

<强>的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>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();

答案 1 :(得分:0)

编辑:

我误解了这个问题,我认为你正在寻找的是一个简单的尝试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');
});