1

如果我使用外部依赖项(javascript/css)渲染一个实际的 html 站点

$app->render("./somewhere/index.html");

或者

echo "<html>...</html>";

由于某种原因,slim 无法解析依赖路径 - 因此无法正确加载该站点。一种解决方法是 $app->redirect("./somewhere/index.html"); 而不是 $app->render("./somewhere/index.html"); - 但浏览器地址栏中的 URL 路径也会发生变化。我想避免这种情况,因为我只想为从 URI 接收到的 REST 请求显示一个 HTML 模板 - 所以没有必要重定向到 html 文档并丢失 REST 参数。

我的问题的一个sscce:

目录结构:

- index.php
+ templates
|-- index.html
|-- dependency.js
+ Slim
|-- ...
|-- ...

索引.php:

<?php
require 'Slim/Slim.php';
\Slim\Slim::registerAutoloader();
$app = new Slim\Slim();
$app->get('/:id', function ($id) use ($app) {
    $app->render('index.html');
});
$app->run();
?>

/模板/index.html:

<html>
<head>
    <title>SSCCE</title>
    <script id="someid" type="text/javascript" src="dependency.js"></script>
</head>
<body>
    <a href="javascript:func_test()">Click here</a> 
</body>
</html>

/模板/dependency.js:

function func_test() {
  alert("Test");
} 

1.) 成功:直接访问 /templates/index.html。(即通过输入 127.0.0.1/templates/index.html)。单击“单击此处”会打开一个消息框。

2.) 失败:从 Slim 访问 index.php 文件(注意:我没有在网络服务器上激活 mod_rewrite - 所以我使用 index.php/.../ 作为 URI 即 127.0.0.1/index.php/睾丸)。html 站点加载正确,但如果我单击“单击此处”,则没有任何反应。

我已经尝试过:src="../dependency.js"、src="../templates/dependency.js" 的不同变体,将 index.html 更改为 php 文件并使用 src="$webroot/templates/dependency .js” - 但没有任何效果。知道如何解决这个问题吗?

4

1 回答 1

3

我认为您对通常如何使用 Slim(或其他类似的微框架,如 Silex)感到困惑。您的资产(如 JS/CSS/images)不应该与您的路由 url 相关,因为该路由 url 不会直接映射到基于文件系统的资源。应该是绝对的。您的设置应如下所示:

Slim/
templates/
  index.html
  whatever.html
images/
js/
  /dependency.js
css/

所以你所有的 js 引用应该是这样的:

src="/js/dependency.js"

除非您想编写某种特殊的控制器来根据模板或其他东西提供正确的资源。但是,如果您的应用程序布局足够复杂以至于需要某些东西,您可能应该使用更像 Symfony2 或 ZF 的东西,它们具有封装完整功能集的模块/捆绑包的概念。

此外,您不应该能够通过 URL 公开访问模板,因为这些模板只能由您的 Slim 控制器提供服务。事实上,我通常不会在文档根目录中有模板。我的正常设置通常看起来像这样(public将是网络服务器文档根):

Slim/
templates/
  index.html
public/
  index.php
  js/
  images/
  css/
于 2013-02-23T03:20:36.760 回答