1

外部依存関係 (javascript/css) を使用して実際の html サイトをレンダリングすると、

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

また

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

何らかの理由で、スリムは依存関係のパスを解決できないため、サイトを正しくロードできません。回避策は $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
|-- ...
|-- ...

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" - しかし、何も機能しませんでした。これを修正する方法はありますか?

4

1 に答える 1

3

通常、Slim (または Silex のような別の類似のマイクロフレームワーク) でどのように作業するかを混乱させていると思います。ルーティングされた URL はファイル システム ベースのリソースに直接マップされないため、JS/CSS/画像などのアセットは、ルーティングされた URL に対して現実的であってはなりません。は絶対的なものでなければなりません。セットアップは次のようになります。

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

したがって、すべての js 参照は次のようになります。

src="/js/dependency.js"

テンプレートなどに基づいて正しいリソースを提供するために、ある種の特別なコントローラーを作成したい場合を除きます。しかし、アプリケーションのレイアウトが非常に複雑で、これに似たものが必要な場合は、機能の完全なセットをカプセル化するモジュール/バンドルの概念を持つ Symfony2 や ZF のようなものを使用する必要があります。

さらに、テンプレートは Slim コントローラーによってのみ提供される必要があるため、URL によって公開されているテンプレートにアクセスできないようにする必要があります。実際、私は通常、ドキュメントルート内にテンプレートを持っていません。私の通常のセットアップは通常、次のようpublicになります(Webサーバーのドキュメントルートになります):

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