【问题标题】:Slim Framework Base URLSlim 框架基础 URL
【发布时间】:2012-07-13 22:29:39
【问题描述】:

我是 Slim 框架的新手。如何像使用 Codeigniter 函数base_url() 一样获取基本 URL?

谢谢

【问题讨论】:

    标签: php slim


    【解决方案1】:

    使用 Slim v3,由于它实现了 PSR7,因此您可以获得 PSR7 Uri 对象并调用 Slim3 在其上添加的 getBasePath() 方法。简单写:

    $basePath = $request->getUri()->getBasePath();
    

    来自Slim v3 documentation

    基本路径

    如果您的 Slim 应用程序的前端控制器位于文档根目录下的物理子目录中,您可以使用 Uri 对象的 getBasePath() 方法获取 HTTP 请求的物理基本路径(相对于文档根目录)。如果 Slim 应用程序安装在文档根目录的最顶层目录中,这将是一个空字符串。

    请注意,getBasePath() 方法是由框架添加的,不是PSR7 UriInterface 的一部分。

    【讨论】:

    • PSR-7 Uri接口中没有getBasePath()这样的方法。
    • @StefanoTorresi : 也许你误解了我表达不好的意思(英语不是我的母语):Slim3 在 PSR7 Uri 对象上提供了一个 getBasePath() 。我从来没有写过这个方法是 PSR7 Uri 接口的一部分。请参考 Slim3 文档。
    • 我理解你的意思,但是,是的,正如你承认的那样,它的表达不正确:getBasePath() 方法特定于 Slim\Http\Uri,它不符合 PSR-7。鉴于文档的其余部分建议并且正确地暗示反对 PSR-7 接口,使用特定于实现的方法将导致供应商锁定,并会损害 PSR-7 支持旨在提供的可移植性第一名。为了澄清你的答案,我建议放弃 PSR-7 参考,因为它现在意味着建议的方法是标准的一部分。
    • 好多了! ?
    • 很抱歉迟到了,但我认为目前正确的方法是getBaseUrl()
    【解决方案2】:

    如果你使用的是 TWIG,那么在 Slim v3 调用中 -

    {{ base_url() }}
    

    或使用{{ path_for('yourRouteName') }}

    【讨论】:

      【解决方案3】:

      获取基本 url 的最简单方法是附加请求 url 和请求根 url,如下所示: $req = $app->request; $base_url = $req->getUrl()."".$req->getRootUri()."/";

      【讨论】:

        【解决方案4】:

        我可以使用{{ app.request.getRootUri }} 获取基本网址(我使用的是 Twig 模板引擎)。 顺便说一句,这与“SCRIPT_NAME”环境变量相同。

        【讨论】:

          【解决方案5】:

          在我们最近使用 Twig 的应用中,我们按如下方式分配 httpBasePath:

          $view = $app->view()->getEnvironment();
          $view->addGlobal('httpBasePath', $app->request->getScriptName());
          

          addGlobal() 方法可能等同于$app->view()->appendData(),我不确定。

          使用$app->request->getScriptName() 的优点是我们不必手动设置文件夹名称或关心它是什么——一个开发人员可以拥有位于http://example.localhost 的repo,另一个可以拥有位于http://localhost/projects/slim 的repo,并且无需配置。

          【讨论】:

            【解决方案6】:

            尝试在 index.php 中设置视图的基本 url

            $app->hook('slim.before', function () use ($app) {
                $posIndex = strpos( $_SERVER['PHP_SELF'], '/index.php');
                $baseUrl = substr( $_SERVER['PHP_SELF'], 0, $posIndex);
                $app->view()->appendData(array('baseUrl' => $baseUrl ));
            });
            

            【讨论】:

            • 这让我想起了WordPress中的相同功能,这应该包含在框架文档的“基础”中。
            【解决方案7】:

            您需要先手动设置基本网址,然后才能获取它 就像这样:

            $app->hook('slim.before', function () use ($app) {
                $app->view()->appendData(array('baseUrl' => '/base/url/here'));
            });
            

            http://help.slimframework.com/discussions/questions/49-how-to-deal-with-base-path-and-different-routes

            【讨论】:

            • 我想他是在问如何“获取”而不是“设置”
            • 是的,我注意到了,但您需要先设置。默认情况下,它不是,编辑我的答案以澄清这一点
            • @SosialLab 对,要获得 [使用上述方法设置后]... 在您的模板中,请使用类似 <base href="{{ baseUrl }}" />
            • 您好,感谢您的回复。我使用 $app->render()。如何配置?
            • @SosialLab 您需要阅读文档并了解设置、获取、MVC 结构和精简编码的工作原理。