我不确定我应该如何处理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功能,但到目前为止还没有用。
答案 0 :(得分:1)
<强>更新强>
如果您使用会话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');
});