1

I am new to Slim Framework and PHP. I cant get this to work, if I use a normal function and use "foo" as a parameter, it works, but doesnt work like this, even tho the documentation uses pretty much the same thing 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");
    });

?>

The error is

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

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

4

4 回答 4

5

我想我在这里要说的第一件事是尽量避免将 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");
});
于 2013-04-22T12:22:09.707 回答
1

您可以像这样设置它,以正常方式声明您的函数并将带有其名称的字符串传递给路由器方法。这将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');
});
于 2013-05-21T17:59:27.063 回答
1

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

$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";
    } 
};
于 2015-02-17T19:45:17.423 回答
0

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

例如

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

您对代码列表中的路由执行相同的操作。

于 2013-05-21T10:14:13.063 回答