为什么 slim 需要完整的目录路径来加载外部资产 (js/css) 文件
why slim requires full directory path for loading external assets(js/css) file
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<script type="text/javascript" src="/slim/app/views/animations/jquery.min.js"></script>
<script type="text/javascript" src="/slim/app/views/animations/bootstrap.min.js"></script>
<link rel="stylesheet" href="/slim/app/views/animations/bootstrap.min.css">
</head>
<body>
<div class="container">
hello
</div>
</body>
</html>
我必须指定用于加载 js 和 css 文件的完整目录路径
(jquery.min.js 和 bootstrp.min.js 和 bootstrap.min.css)。我有
(/slim/app/views/animations/) 作为包含所有
文件。如果当前我在 views 目录中,我应该使用
(animations/whatever 文件名)但在这些文件中不起作用
方法。但如果我使用完整的目录路径,一切正常。为什么这些
谁能解释一下。
(slim) 是我安装 slim 的根目录
使用相对路径不是您通常使用 Slim 的方式。您的资产(JavaScript/CSS/images 等)应该从您的观点中绝对引用:
src="/assets/js/myapp.js"
路由 URLs 不直接映射到基于文件系统的资源,因为模板不应被 URL publically 访问 - 它们仅由控制器提供服务。
一个普通的苗条file structure长这样:
app/
public/index.php
templates/
view.html
assets/
images/
js/
css/
Some 将资产子文件夹直接添加到 public 文件夹中。
Others 在根级别上有这些文件夹。
但是,一般来说,public 资源(例如 CSS、JS、图像)应该位于 public 文档根目录下(public 可以访问)。
如果您不喜欢这种行为,可能会有帮助的一件事是使用 Slim 的 basePath 变量。
您应该能够在 index.php
的 slim.before
回调中将基础 URL 设置为视图变量,以便它可用于所有路由,如下所示:
$app->hook('slim.before', function () use ($app) {
$app->view()->appendData(array('baseUrl' => '/base/url/here'));
});
或
$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 ));
});
然后将其应用于基本模板文件的 HTML 标记中的引用,仅此而已。
<link rel="stylesheet" type="text/css" href="{{ base_url() }}/css/style.css" />
或使用Uri::getBaseUrl(),例如
$basePath = $request->getUri()->getBasePath();
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<script type="text/javascript" src="/slim/app/views/animations/jquery.min.js"></script>
<script type="text/javascript" src="/slim/app/views/animations/bootstrap.min.js"></script>
<link rel="stylesheet" href="/slim/app/views/animations/bootstrap.min.css">
</head>
<body>
<div class="container">
hello
</div>
</body>
</html>
我必须指定用于加载 js 和 css 文件的完整目录路径 (jquery.min.js 和 bootstrp.min.js 和 bootstrap.min.css)。我有 (/slim/app/views/animations/) 作为包含所有 文件。如果当前我在 views 目录中,我应该使用 (animations/whatever 文件名)但在这些文件中不起作用 方法。但如果我使用完整的目录路径,一切正常。为什么这些 谁能解释一下。
(slim) 是我安装 slim 的根目录
使用相对路径不是您通常使用 Slim 的方式。您的资产(JavaScript/CSS/images 等)应该从您的观点中绝对引用:
src="/assets/js/myapp.js"
路由 URLs 不直接映射到基于文件系统的资源,因为模板不应被 URL publically 访问 - 它们仅由控制器提供服务。
一个普通的苗条file structure长这样:
app/
public/index.php
templates/
view.html
assets/
images/
js/
css/
Some 将资产子文件夹直接添加到 public 文件夹中。 Others 在根级别上有这些文件夹。
但是,一般来说,public 资源(例如 CSS、JS、图像)应该位于 public 文档根目录下(public 可以访问)。
如果您不喜欢这种行为,可能会有帮助的一件事是使用 Slim 的 basePath 变量。
您应该能够在 index.php
的 slim.before
回调中将基础 URL 设置为视图变量,以便它可用于所有路由,如下所示:
$app->hook('slim.before', function () use ($app) {
$app->view()->appendData(array('baseUrl' => '/base/url/here'));
});
或
$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 ));
});
然后将其应用于基本模板文件的 HTML 标记中的引用,仅此而已。
<link rel="stylesheet" type="text/css" href="{{ base_url() }}/css/style.css" />
或使用Uri::getBaseUrl(),例如
$basePath = $request->getUri()->getBasePath();