21

一部のzf2モジュールには、js / css/imagesなどのリソースを配布するためのパブリックディレクトリがあります。これらのリソースをアプリケーションで利用できるようにするためのベストプラクティスは何ですか?

これらのリソースがを介して自動的に利用できるようにしたいと思いますhttp://mysite.com/[moduleName]/。例えば、

root/public/js/sitescript.js->http:\\mysite.com\js\sitescript.js

root/module/mymodule/public/js/modulescript.js->http:\\mysite.com\mymodule\js\modulescript.js

root/vendor/vendormodule/public/js/vendorscript.js->http:\\mysite.com\vendormodule\js\vendorscript.js

これらのリソースをルート/パブリックディレクトリにコピーする必要がありますか?手動でコピーするのは面倒で、ディレクトリをマージする自動ビルドプロセスも非常に実用的ではないと思います。

おそらく、httpd.confまたは.htaccessで機能する魔法がありますか?

おそらくシンボリックリンクが解決策ですか?ただし、シンボリックリンクはWindowsプラットフォームで使用するのは簡単ではなく、個々のモジュールごとに手動で作成する必要があります。

4

3 に答える 3

18

これを処理する4つの方法があります:

  1. public/ディレクトリ内のアセットのシンボリックリンク
  2. モジュールからpublic/ディレクトリにアセットをコピーして貼り付ける
  3. 特定の仮想ホスト構成(または通常はWebサーバー構成)を使用する
  4. 次のいずれかのようなアセットマネージャーモジュールを使用します。

    • AssetManager ( asseticに裏打ちされています)は、実行時にアセットをマージし、本番環境用のキャッシングとCSS/JSミニファイおよびLESS/SASS変換用のフィルターを備え、モジュール自体のディレクトリからアセットを公開できるようにします。
    • zf2-assetic-module-asseticに裏打ちされた-実行時にCSS/JSミニファイとLESS/SASS変換を処理します
    • BaconAssetLoader-public/デプロイ時にディレクトリにアセットをデプロイすることにより、モジュールからアセットを公開します
于 2012-04-25T12:56:54.487 に答える
5

それを行うには多くの方法があります。

私の意見では、Asseticはコンピューティングパフォーマンスの無駄であり、この単純な問題には非常に適していません。

前述のように、問題はモジュールから/publicにアクセスすることです。

私の解決策は次のとおりです。

htdocs / yoursite / public / .htaccessを編集して、RewriteEngineOnの直後にこの行を追加します。

RewriteRule ^resource/([a-zA-Z0-9\.\-]+)/([a-zA-Z0-9\.\-_\/]+)$ index.php?action=resource&module=$1&path=$2 [QSA,L]

htdocs / yoursite / public / index.phpを編集し、chdir(dirname( DIR));の直後にこのコードを追加します。

if (isset($_GET['action']) && $_GET['action'] == "resource") {
    $module = $_GET['module'];
    $path = $_GET['path'];
    if (!ctype_alnum($module))
        die("Module name must consist of only alphanumeric characters");

    $filetype = pathinfo($path, PATHINFO_EXTENSION);
    $mimetypes = array(
        'js' => "text/javascript",
        'css' => "text/css",
        'jpg' => "image/jpeg",
        'jpeg' => "image/jpeg",
        'png' => "image/png"
    );

    if (!isset($mimetypes[$filetype]))
        die(sprintf("Unrecognized file extension '%s'. Supported extensions: %s.", htmlspecialchars($filetype, ENT_QUOTES), implode(", ", array_keys($mimetypes))));

    $currentDir = realpath(".");
    $destination = realpath("module/$module/public/$path");
    if (!$destination)
        die(sprintf("File not found: '%s'!", htmlspecialchars("module/$module/public/$path", ENT_QUOTES)));

    if (substr($destination, 0, strlen($currentDir)) != $currentDir)
            die(sprintf("Access to '%s' is not allowed!", htmlspecialchars($destination, ENT_QUOTES)));

    header(sprintf("Content-type: %s", $mimetypes[$filetype]));
    readfile("module/$module/public/$path", FALSE);
    die();
}

使用法:/ resource / moduleName / path

例: http: //yoursite.com/resource/Statistics/css/style.cssは、yoursite / module / Statistics / public / css/style.cssから実際のcssを読み取ります。

高速で安全であり、構成でパスを指定する必要がなく、インストールも必要なく、サードパーティのメンテナンスに依存せず、ビューにヘルパーも必要ありません。どこからでも/resourceにアクセスするだけです!楽しみ :)

于 2012-12-12T14:55:45.593 に答える
0

phingを使用してビルドプロセスを管理し、すべてを自動化することができます。ビルドスクリプトを作成する必要がありますが、その後はCDプレーヤーで再生を押すようなものになります。

もちろん、テストするのは面倒です。

于 2012-08-05T04:03:45.367 に答える