Routes Slim Framework-无法添加路由中间件

Routes Slim Framework-无法添加路由中间件,routes,middleware,slim,Routes,Middleware,Slim,我是Slim框架和PHP的新手。我不能让它工作,如果我使用普通函数并使用foo作为参数,它可以工作,但不能像这样工作,即使文档使用了几乎相同的东西 $app->get/,$foo,函数{line我想我在这里要说的第一件事是尽量避免将您称为全局Slim实例 从文档中,我们实际上调用Slim getInstance方法来获取当前Slim实例的副本。我将重写下面的代码,查看文档,并查看其中的一些教程 <?php require 'Slim/Slim.php'; session_start();

我是Slim框架和PHP的新手。我不能让它工作,如果我使用普通函数并使用foo作为参数,它可以工作,但不能像这样工作,即使文档使用了几乎相同的东西


$app->get/,$foo,函数{line

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

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

<?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");
});

我想我在这里要说的第一件事是尽量避免将您称为全球客户

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

<?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");
});

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

比如说

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

您在代码列表中的下一步路由上也做了同样的事情。

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

比如说

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

您可以在代码列表的下面对路由执行相同的操作。

您可以这样设置,以正常方式声明函数,并将带有名称的字符串传递给router方法。这将在执行router关闭之前调用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');
});

您可以这样设置,以正常方式声明函数,并将带有名称的字符串传递给router方法。这将在执行router闭包之前调用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');
});

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

$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";
    } 
};

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

$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";
    } 
};

老问题,但我认为值得一提的是,这实际上是对原始问题的唯一正确答案。分号在检查代码时很容易漏掉,但它很重要。谢谢。老问题,但我觉得值得一提的是,这实际上是对原始问题的唯一正确答案。分号在检查代码时很容易漏掉,但它很重要。谢谢