【发布时间】:2012-07-13 22:29:39
【问题描述】:
我是 Slim 框架的新手。如何像使用 Codeigniter 函数base_url() 一样获取基本 URL?
谢谢
【问题讨论】:
我是 Slim 框架的新手。如何像使用 Codeigniter 函数base_url() 一样获取基本 URL?
谢谢
【问题讨论】:
使用 Slim v3,由于它实现了 PSR7,因此您可以获得 PSR7 Uri 对象并调用 Slim3 在其上添加的 getBasePath() 方法。简单写:
$basePath = $request->getUri()->getBasePath();
基本路径
如果您的 Slim 应用程序的前端控制器位于文档根目录下的物理子目录中,您可以使用 Uri 对象的 getBasePath() 方法获取 HTTP 请求的物理基本路径(相对于文档根目录)。如果 Slim 应用程序安装在文档根目录的最顶层目录中,这将是一个空字符串。
请注意,getBasePath() 方法是由框架添加的,不是PSR7 UriInterface 的一部分。
【讨论】:
getBasePath()这样的方法。
getBasePath() 方法特定于 Slim\Http\Uri,它不符合 PSR-7。鉴于文档的其余部分建议并且正确地暗示反对 PSR-7 接口,使用特定于实现的方法将导致供应商锁定,并会损害 PSR-7 支持旨在提供的可移植性第一名。为了澄清你的答案,我建议放弃 PSR-7 参考,因为它现在意味着建议的方法是标准的一部分。
getBaseUrl()
如果你使用的是 TWIG,那么在 Slim v3 调用中 -
{{ base_url() }}
或使用{{ path_for('yourRouteName') }}
【讨论】:
获取基本 url 的最简单方法是附加请求 url 和请求根 url,如下所示:
$req = $app->request;
$base_url = $req->getUrl()."".$req->getRootUri()."/";
【讨论】:
我可以使用{{ app.request.getRootUri }} 获取基本网址(我使用的是 Twig 模板引擎)。
顺便说一句,这与“SCRIPT_NAME”环境变量相同。
【讨论】:
在我们最近使用 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,并且无需配置。
【讨论】:
尝试在 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 ));
});
【讨论】:
您需要先手动设置基本网址,然后才能获取它 就像这样:
$app->hook('slim.before', function () use ($app) {
$app->view()->appendData(array('baseUrl' => '/base/url/here'));
});
【讨论】:
<base href="{{ baseUrl }}" />