Slim PHP中使用$ app-> render()的外部依赖关系的相对路径

时间:2013-02-23 02:59:30

标签: php html rest slim

如果我使用

呈现具有外部依赖关系(javascript / css)的实际html网站
$app->render("./somewhere/index.html");

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

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

我的问题的一个sscce:

dir结构:

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

的index.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();
?>

/templates/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>

/templates/dependency.js:

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

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

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

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

1 个答案:

答案 0 :(得分:3)

我认为你很混淆你通常如何使用Slim(或像Silex这样的其他类似的Microframework)。您的资源(如JS / CSS /图像)不应该对您的路由网址有所了解,因为该路由网址不会直接映射到基于文件系统的资源。应该是绝对的。您的设置应如下所示:

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

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

src="/js/dependency.js"

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

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

Slim/
templates/
  index.html
public/
  index.php
  js/
  images/
  css/