新宿末廣亭で落語を聞いてきました。

若手からベテランまで、本当に面白い!落語って面白い!ライブがいいですね。

さて、本書P.170で、メニューバーにロゴイメージを表示する下りがあります。

本書ではここは

<img src=”/assets/img/logo01.png” alt=””>

という<img>タグを使用しております。

これ、私の拙い経験からなんですけど、初心者って、意外に結構な割合でこの<img>タグで詰まります。例の画像が表示できないときのマークが出ちゃう。

これは、このsrc=””に書くパスの書き方が幾通りかあり、それをきちんと理解できないで妙な指定の仕方になっているケースがほとんどです。

HTMLとして考えれば、

1)相対パスとして書く

2)絶対パスを書く

という二通りの考え方ができます。パスというよりURLと言ったほうがいいかも知れませんが。

もうひとつ、本書のようにFuelPHPのようなフレームワークを使用した場合の考え方です。

これは、

3)ドキュメントルートの先を書く

というものになるかと思います。

FuelPHPの場合、普通にフレームワークとしての機能を使うのであれば、1)の相対パスは通用しないと思ったほうが良いでしょう。

普通にHTMLを学んだ経験、あるいはPHPの初歩を学んだ経験のある方にとっては、この<img>タグのsrc=””や、<a>タグなどのhref=””など、相対パスで書く方法を学んだ方にとってもフレームワークは戸惑わせる元になります。

3)ドキュメントルートの先を書く

とは、

もう一度本書の

<img src=”/assets/img/logo01.png” alt=””>

これをお借りすれば、日本語に直したとき、

「ドキュメントルートの直下にある、assetsというフォルダの中の、imgというフォルダの中の、logo01.png」

という指定の仕方になるかと思います。

本書はドキュメントルートを/mnt/fuelphp/public に設定してますので、確かにその下にassetsフォルダが存在します。それで動くのです。

私の場合は、ドキュメントルートをApacheのデフォルトである、/var/www/htmlにしており、

そこへ、/mnt/fuelphp/pubulicへのシンボリックリンクをdonichiという名前でおいておりますので

<img src=”/donichi/assets/img/logo01.png” alt=””>

という書き方になります。donichiとは/mnt/fuelphp/publicを指すので、その下にassetsがありますもんね。

もうひとつ、FuelPHPはとてもよく設計されたフレームワークです。全てのURLリクエストは、public/index.phpが受け取ることになっており、その同階層にassetsというフォルダがあり、その中に「css」「img」「js」というフォルダがあらかじめ用意されております。

ここにさえ、それぞれの用途のファイルを集めておけばAsset::css()やAsset::js()、Asset::img()で取れるように設計されています。これらAssetクラスが持つ各メソッドは、その引数に記されたファイルをpublic/assetsの中に探しに行き、なんと絶対パス付きのそれぞれのタグを自動生成します。

そして、config.phpの設定さえ正しくしておけば、この構文は本書通りでも、私のようにひねった書き方をしていても正しく動きます。

(もしかしたらconfig.php関係ないかもしれません)

<?php echo Asset::img(‘logo01.png’);?>

こんな書き方になります。

では、このAssetクラスのimg()メソッドが生成しているhtmlタグはどんなものでしょう?

<img src=”http://localhost/donichi/assets/img/logo01.png?1436116766” alt=”” />

モロのフルURLと言いましょうか。

しかし、これとて、読み解けば同じ意味になります。

http://localhost/が指し示すのはドキュメントルートです。つまり、

「ドキュメントルートの下の、donichiの下の、assetsの下のimgの下のlogo01.png」という意味です。

この中の /donichi/がシンボリックリンクで、/mnt/fuelphp/public/を指していますから、ちゃんとその下にassetsフォルダが存在します。

FuelPHPはそこらあたりを意識させない、ルール通りにpublic/assetsの下に各ファイルを配置してくれれば、Assetクラスのメソッドでファイル名だけの指定をすれば探しにいってくれます。

このフレームワークの規則に則った書き方なのか、そこから外れた本来のhtmlとして今動いているのか、それをきちんと判別できるようにしておきましょう。

FuelPHPを使いながら相対パスなど考え出すとドツボにはまります。

まだ着手はしてませんが、おそらくCakePHPでもそのあたりの考えは同じなのではないでしょうか。意外とこのへん、少しの慣れが必要な部分です。1年経っても詰まり気味の若手は少なくありません。

ということで次回。