【问题标题】:Slim Framework - cannot add route middlewareSlim 框架 - 无法添加路由中间件
【发布时间】:2013-04-06 04:38:48
【问题描述】:

我是 Slim 框架和 PHP 的新手。我无法让它工作,如果我使用普通函数并使用“foo”作为参数,它可以工作,但不能像这样工作,即使文档使用几乎相同的东西http://docs.slimframework.com/

<?php
    require 'Slim/Slim.php';
    session_start();

    \Slim\Slim::registerAutoloader();
    $app = new \Slim\Slim();


    $foo = function() {
       global $app;
        if(!isset($_SESSION["user_id"])) {
            $app->redirect("/redirecto/login");
        } else {
            echo "Authenticated";
        } 
    }

    $app->get("/", $foo, function() {
        global $app;
        $app->render('index.php');
    });

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

?>

错误是

Parse error: syntax error, unexpected '$app' (T_VARIABLE) in C:\xampp\htdocs\redirecto\index.php on line 41 

($app->get("/", $foo, function() { 行)

【问题讨论】:

    标签: routes middleware slim


    【解决方案1】:

    我想我在这里要说的第一件事是尽量避免将 Slim 实例称为全局实例。

    从文档中,我们实际上调用了 Slim getInstance 方法来获取当前 Slim 实例的副本。我将重写下面的代码,查看文档并查看nettuts 上的一些教程,因为它们有帮助。

    <?php
    require 'Slim/Slim.php';
    session_start();
    
    \Slim\Slim::registerAutoloader();
    $app = new \Slim\Slim();
    
    
    $foo = function() {
        $app = \Slim\Slim::getInstance();
        if(!isset($_SESSION["user_id"])) {
            $app->redirect("/redirecto/login");
        } else {
            echo "Authenticated";
        } 
    }
    
    $app->get("/", $foo, function() use ($app) {
        $app->render('index.php');
    });
    
    $app->get("/login", function() use ($app) {
        $app->render("login.php");
    });
    

    【讨论】:

      【解决方案2】:

      您可以像这样设置它,以正常方式声明您的函数,并将带有其名称的字符串传递给路由器方法。这将在执行路由器关闭之前调用foo()

      function foo() {
          $app = \Slim\Slim::getInstance();
          if(!isset($_SESSION["user_id"])) {
              $app->redirect("/redirecto/login");
          } else {
              echo "Authenticated";
          } 
      }
      
      $app->get("/", 'foo', function() use ($app) {
          $app->render('index.php');
      });
      

      【讨论】:

        【解决方案3】:

        正如其他人告诉你的那样,以下是一种不好的做法

        $foo = function() {
           global $app;
            if(!isset($_SESSION["user_id"])) {
                $app->redirect("/redirecto/login");
            } else {
                echo "Authenticated";
            } 
        }
        

        你应该把它声明为

        $foo = function() use ($app) {
        

        然而,专门针对错误

        Parse error: syntax error, unexpected '$app' (T_VARIABLE) in C:\xampp\htdocs\redirecto\index.php on line 41 
        

        这是因为在按照您的方式定义闭包后,您需要添加分号}。所以你的闭包应该变成:

        $foo = function() use ($app) {
           global $app;
            if(!isset($_SESSION["user_id"])) {
                $app->redirect("/redirecto/login");
            } else {
                echo "Authenticated";
            } 
        };
        

        【讨论】:

        • 老问题,但恕我直言,值得一提的是,这实际上是原始问题的唯一正确答案。检查代码时分号很容易漏掉,但它很重要。谢谢。
        【解决方案4】:

        您将中间件创建为一个匿名函数,该函数创建了它自己的范围。要在函数内部使用$app 变量,您需要使用use 语句将其传递到作用域中。

        例如

        $foo = function () use ($app) {
            $app = \Slim\Slim::getInstance();
            if(!isset($_SESSION["user_id"])) {
                $app->redirect("/redirecto/login");
            } else {
                echo "Authenticated";
            } 
        }
        

        您在代码清单的下方对路线做同样的事情。

        【讨论】:

          猜你喜欢
          • 2018-03-08
          • 2015-02-14
          • 2015-03-17
          • 1970-01-01
          • 2014-08-11
          • 2016-06-28
          • 2017-10-13
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多