【问题标题】:Slim framework flash and middlewareSlim 框架闪存和中间件
【发布时间】:2016-01-15 06:12:44
【问题描述】:

我正在学习如何使用 Slim 框架,但在自定义中间件中使用 flash 消息时遇到问题。

问题很简单:我在中间件中使用$app->flash('error', 'my message');,下一页没有消息。

顺便说一句,中间件很好用

这是我的代码:

中间件

class SessionMiddleware extends \Slim\Middleware {

    public function call() {

        $app = $this->app;
        $req = $app->request;


        if(!preg_match('#^(/public)#', $req->getPath())) {
            if(isset($_SESSION['user']) && !empty($_SESSION['user'])) {
                //Do something
            } else {
                $app->flash('error', 'You must be logged');
                if($req->getPath() != '/login') {
                    $app->redirect('/login');
                }
            }
        }

        $this->next->call();

    }

}

登录

<?php
if(isset($_SESSION['slim.flash']['error'])) {
    echo '<p class="alert alert-danger"><strong>Error</strong>: '.$_SESSION['slim.flash']['error'].'</p>';
}
?>

应用

$app = new \Slim\Slim(array(
  'mode' => 'development',
  'debug' => true,
  'templates.path' => './templates'
));

$app->add(new \SessionMiddleware());

$app->get('/login', function() use($app) {
  $app->render('login.php');
});

有什么办法解决这个问题吗?

谢谢

【问题讨论】:

  • 您应该知道,在即将发布的第 3 版中,flash messages are being removed
  • 你是用session_start开始会话吗?
  • 是的 Gustavo,我正在使用 session_start();在 index.php 上
  • 感谢 alexw 的信息!也许我应该开始学习 Slim V3,但我找不到任何好的文档:/
  • @Ashraam 以下是 Slim V3 文档:slimframework.com/docs

标签: php frameworks slim middleware


【解决方案1】:

尝试使用flashNow代替flash方法。

【讨论】:

    【解决方案2】:

    我还看到 'flash' 和 'flashNow' 方法在中间件中不起作用。要添加 Flash 消息,我决定手动添加。它有效,但我知道这不是最好的方法。

    $_SESSION['slim.flash']['error'] = 'message';
    

    【讨论】:

      【解决方案3】:

      我自己也遇到了这个问题。

      由于 Flash 是一个应用中间件组件并且默认添加,并且在您添加任何自定义应用中间件组件之前,它实际上不会在您的中间件被调用时被初始化。

      做@kkochanski 所做的事情很老套,但可能是唯一的选择,除了删除/取消设置 Flash 并将其添加为最终的应用程序中间件组件。

      【讨论】:

        【解决方案4】:

        我面临同样的问题并解决它。例如,您可以通过在经过身份验证的路由中调用另一个方法并在其中闪烁来实现这一点

        class AuthController
        {
          public function flashError($request, $response)
          {
            // flash
            // redirect
          }
        }
        

        它对我很有效。所以你可以重定向到并确保这个方法处理它。这样你就可以在中间件之外闪烁消息了。

        【讨论】:

          猜你喜欢
          • 2017-02-28
          • 2015-02-14
          • 2013-06-27
          • 1970-01-01
          • 1970-01-01
          • 2015-03-17
          • 1970-01-01
          • 1970-01-01
          • 2016-02-04
          相关资源
          最近更新 更多