【问题标题】:Page not found (Slim Framework)找不到页面(Slim 框架)
【发布时间】:2017-02-24 09:59:22
【问题描述】:
<?php
use \Psr\Http\Message\ServerRequestInterface as Request;
use \Psr\Http\Message\ResponseInterface as Response;

require '../vendor/autoload.php';
require '../src/config/db_standings.php';

$app = new \Slim\App;

require '../src/routes/ppg.php';

require '../src/routes/standings.php';

$app->run();

所以这是我的index.php 文件,我不明白为什么它的行为方式只是加载最后一条所需的路线。在这种情况下,只有standings.php。无论我最后添加什么路线,它只会加载最后一条路线,并且找不到其他页面。我做错了什么?

排名.php

<?php

Header('Content-Type: application/json; charset=UTF-8');

use \Psr\Http\Message\ServerRequestInterface as Request;
use \Psr\Http\Message\ResponseInterface as Response;

$app = new \Slim\App;

$app->get('/api/standings', function(Request $request, Response $response){
    $sql = "SELECT * FROM standings";

    try {
        $db = new db_standings();
        $db = $db->connect();

        $stmt = $db->query($sql);
        $standings = $stmt->fetchAll(PDO::FETCH_OBJ);
        $db = null;

        $json = json_encode($standings, JSON_UNESCAPED_UNICODE);

        echo($json);

    } catch(PDOException $e) {
        echo '{"error": {"text": '.$e->getMessage().'}';
    }
});

ppg.php

<?php

Header('Content-Type: application/json; charset=UTF-8');

use \Psr\Http\Message\ServerRequestInterface as Request;
use \Psr\Http\Message\ResponseInterface as Response;

$app = new \Slim\App;

$app->get('/api/ppg', function(Request $request, Response $response){
    echo 'BANANAS';
});

【问题讨论】:

    标签: php slim


    【解决方案1】:

    index.php 中,您正在创建 Slim 应用程序实例并将其放入 $app 变量中:

    <?php
    
    $app = new \Slim\App; # This is new Slim app contained in $app variable
    
    // executing code of standings.php...
    // executing code of ppg.php...
    
    $app->run(); # Here you run the application that is contained in $app variable.
    

    但是您在每个包含的文件中执行相同的操作:standings.phpppg.php

    因此,当您包含 standings.php 时,您会覆盖 $app 变量的内容,添加文件中声明的路由。

    然后你包含 ppg.php 覆盖 $app 实例(因此,已声明的路由)并附加其路由。

    当执行流程返回到index.php 时,它运行$app-&gt;run(),而$app 恰好是包含在最后一个文件中创建的那个。

    因此要解决问题,只需删除此行

    $app = new \Slim\App;
    

    来自除index.php之外的所有文件。

    更新

    在你写的 cmets 中

    删除不必要的和更改的 JSON 输出方法后,我得到 “Slim 应用程序错误 - 暂时给您带来不便,敬请见谅”

    好吧,那是因为你做错了,原谅我太苛刻了。

    本质上,Slim 应用程序是一组附加到特定路由的回调。

    通常每个回调接受两个参数:请求和响应对象,并且每个可能(或可能由于某种原因不会)将请求和响应更改为您想要的任何内容。所有的回调一个接一个地被调用,在一个链中。

    规则很简单:任何回调最后都应该返回响应对象。响应可能是任何东西:html 文档、json 数据、文件 - 可以在 HTTP 响应中返回的任何内容。

    因此在你的 Slim 应用程序中,如果你正在做类似的事情

    header('Content-Type: application/json; charset=UTF-8');
    

    echo $jsonString;
    

    那你做错了。您应该构建具有该标头并在正文中包含您的数据的响应对象,而不是设置响应标头并直接输出 JSON。。 Slim 在这方面做得很好,看看(为了更好的抽象,我已经稍微简化了你的代码):

    <?php
    
    use \Psr\Http\Message\ServerRequestInterface as Request;
    use \Psr\Http\Message\ResponseInterface as Response;
    
    $app = new \Slim\App;
    
    // Append callback to a route: note request response arugments.
    $app->get('/api/standings', function(Request $request, Response $response) {
    
        $standingsRepository = new \StandingsRepository;
    
        $standings = $standingsRepository->getAll();
    
        if ($standings) {
        // Return response object
            return $response->withJson($standings);
        } else {
            // Or pass to another callback: note request and response
        return new \Slim\Exception\NotFoundException($request, $response);
        }
    
    });
    

    这里我们使用了Response对象的withJson方法。这会将 application/json 标头设置为您的响应,并将您作为参数传递的任何内容放入正文中。在我们的例子中,它是 $standings 变量的值(我假设它是一个对象数组)。

    我希望我能让你更清楚一点。我强烈建议阅读framework documentation,它会花你一个晚上和两杯咖啡,为你节省很多时间。

    【讨论】:

    • 删除不必要的和更改的 JSON 输出方法后,我收到“Slim 应用程序错误 - 暂时给您带来的不便”
    • 这超出了原始问题的范围,但我已尽我所能更新了答案。考虑问一个不同的问题。
    • 感谢您对在每个文件中覆盖 $app 的详细解释
    【解决方案2】:

    正如@Georgy Ivanov 在以下答案中所建议的,您必须从standings.php 和ppg.php 中删除以下块:

    Header('Content-Type: application/json; charset=UTF-8');
    
    use \Psr\Http\Message\ServerRequestInterface as Request;
    use \Psr\Http\Message\ResponseInterface as Response;
    
    $app = new \Slim\App;
    

    此外,由于您的意图是输出 JSON 响应,因此您可以使用 Slim 的 withJson() 方法简单地实现:

    return $response->withJson($standings);
    

    参考这个https://www.slimframework.com/docs/objects/response.html#returning-json

    【讨论】:

    • 删除不必要的和更改的 JSON 输出方法后,我收到“Slim 应用程序错误 - 暂时给您带来的不便”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多