2012年8月17日金曜日

FuelPHPをWindowsで動作させるときにハマったこと

FuelPHPでスタイルとかイメージとかを出力するとき
<?php echo echo Asset::css('layout.css'); ?>

という書き方をすると思います。
出力されたソースを見てみると
<link type="text/css" rel="stylesheet" href="http://localhost/fuelphp/public/assets/css/layout.css?1344505211" />

特に問題ありません。

が、これをWindows環境(Windows Server 2008 R2 + Apache)で動かしてみると
<link type="text/css" rel="stylesheet" href="http://localhost/fuelphp/public/assets//css//layout.css?1344587285">

こうなってしまいました。

こうなることで何が問題になるかですが
CSSの中でimageのパスを相対で指定している場合
例えば
background: #fff url(../img/logo.png) no-repeat;

CSSファイルの前の // が邪魔してCSSフォルダと同じ階層にあるはずのimgフォルダまでたどり着きません。

一般的?には css で使うイメージは css フォルダに image フォルダを設けると思うので特別問題にもならないことかもしれませんが css 以外でも使ってるような画像があれば不都合が生じます。

しかしなぜWindows環境だけでしか起こらない現象か。
Asset のソースを眺めてたらソースを出力する際に、DIRECTORY_SEPARATORを使用しているのがわかりました。
DIRECTORY_SEPARATORはディレクトリの区切り文字でWindowsでは「¥」、Linuxでは「/」となります。
処理中でトリムして置換して・・・見たいなことをやってるのでそのあたりが問題なような気もしつつ・・・

とりあえずこれを解決する方法としては以下を修正します。

fuel/core/bootstrap.php
<?php

// define('DS', DIRECTORY_SEPARATOR);
define('DS', '/');

(以下省略)
?>

こうすることでとりあえずはOK。
しかし、この DS 自体がほかにどう使われているかわからないで修正する場合は注意が必要かなと思います。




0 件のコメント:

コメントを投稿