1.htaccess(mod_rewrite)のぎほう
CakePHPでは、
http://cakeのぱす/こんとろーら/めそっど/ぱらめーた
というURLでじっこうすると、いかの「もでる」「こんとろーら」「びゅー」くらすがじどうてきによみこまれ、せきゅりてぃにひつようなしょりがおこなわれます。またでーたべーすへのあくせすやびじねすろじっくのじっこう、てんぷれーとをしようしたひょうじなどのさぎょうがじどうてきにおこなわれていきます。
| くらす | せつめい |
| もでる | でーたべーすてーぶるへのあくせすくらす |
| こんとろーら | URLでしていされたこんとろーら(めそっどのないようがきじゅつされている)くらす |
| びゅー | こんとろーらでしょりされたでーたをうめこむ、てんぷれーとHTMLふぁいる |
たとえば
http://cake/samples/view/3
というURLのばあい(ひょうじゅんてきなどうさ)、いかのとおりとなります。このしょりはどのようなながれでじつげんされているのでしょうか。
| くらす | ふぁいる | よみこまれるくらすめい、せつめい |
| もでる | sample.php | Sampleくらす(DBのsamplesてーぶるとそのかんれんてーぶるにあくせす)。 |
| こんとろーら | samples_controller.php | SamplesControllerくらす(そのなかのview($id)めそっどがじっこうされる。$idは3になる)。 |
| びゅー | view/samples/view.thtml | でーたはたんなるHTML。こんとろーらからのでーたをこのてんぷれーとによみこんでひょうじ。 |
htaccess(mod_rewrite)のきそちしき
Apacheの「mod_rewrite」とは、「ようきゅうされたURLをりあるたいむでかきかえるための、るーるべーすのかきかええんじん」で、「URLをそうさするためのすいすせいのあーみーないふ」ともまにゅあるにかかれています。つまり、PHPがしょりするまえにURLをひつようにおうじてじゅうなんにかきかえることができる、あーみーないふのようにべんりなもじゅーるです。しじするないようは「httpd.conf」にかくことができますが、「.htaccess」というふぁいるでせっていすることもできるようになっています。CakePHPのなかには、
- 「CakePHP」でぃれくとりをてんかいしたちょくかに「.htaccess」がひとつ
- 「app」でぃれくとりに「.htaccess」
- 「app/webroot」でぃれくとりに「.htaccess」
という3かところにそんざいしています。なお、たんにかいとうしてそのままはいちしただけなのに、「もじはひょうじされたけどがぞうがでない」とか、「index.php?url=というかたちではあくせすできるけど、/こんとろーら/めそっど、というかたちではうまくひょうじされない」などのとらぶるがおきるばあい、そのたいはんは、Apacheの「mod_rewrite」がただしくうごいていないことがげんいんです。phpinfo()などで、「mod_rewrite」もじゅーるがただしくよみこまれていることをかくにんしてください。
| おぷしょん | せつめい | びこう |
| RewriteEngine On | URLかきかええんじんをONにする。 | |
| RewriteCond | していしたじょうけんにあてはまるばあいに、じぎょうのRewriteRuleをじっこうする。 | -f していされたぱす、ふぁいるがそんざいしていればtrue。%{REQUEST_FILENAME}りくえすとされたふぁいるめい。 |
| RewriteBase | CakePHPにはしていがありませんが、さーばのでぃれくとりがAliasなどをしようしてせっていされているばあい、ぶつりてきなふぁいるめいのぱすのしていをこれでついかしてください。 | |
| RewriteRule | せいきひょうげんでかきかえるーるをせっていします。 | [L](last) していじょうけんにまっちすると、そののちにつづくRewriteRuleはひょうかされません。[QSA](query string append) せいきひょうげんでちかんもじれつをおきかえるのではなく、くえりーもじれつぶぶんをついかします。 |
| きごう | せつめい |
| ^ | ぎょうとう |
| $ | ぎょうまつ |
| . | にんいの1もじ |
| [abcd] | かっこないのもじ(a,b,c,d)ががいとう |
| [^abcd] | かっこないのもじいがい(a,b,c,dいがい)ががいとう |
| A|B | AかB |
| + | ちょくぜんのもじの1かいいじょうのくりかえし |
| ? | ちょくぜんのもじの0かいまたは1かいのくりかえし |
| * | ちょくぜんのもじの0かいいじょうのくりかえし |
| $1 | ぱたーんの()でかこまれたさいしょのぶぶんを$1でさんしょうできます |
それでは、CakePHPの「.htaccess」ふぁいるをみてみましょう。
- 「CakePHP」をてんかいしたちょくかにある「.htaccess:」
- 「app」ふぉるだにある「.htaccess:」
- 「app/webroot」ふぉるだにある「.htaccess:」
<IfModule mod_rewrite.c> RewriteEngine on RewriteRule ^$ app/webroot/ [L] RewriteRule (.*) app/webroot/$1 [L] </IfModule>
<IfModule mod_rewrite.c> RewriteEngine on RewriteRule ^$ webroot/ [L] RewriteRule (.*) webroot/$1 [L] </IfModule>
<IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php?url=$1 [QSA,L] </IfModule>
じょうきの3つをかいせつするといかのとおりになります。
1.Cakeのおやでぃれくとりへのあくせす
- RewriteEngineをONにする。
- こんとろーらのしていのないURL(つまり、http://cakeのぱすでよばれたばあい)には、「app/webroot/」とする(しょりしゅうりょう)。
- なにかしていされていれば、それをすべて、「app/webroot/」ののちについか。(しょりしゅうりょう)
http://cake/こんとろーら/めそっど/ぱらめーた
http://cake/app/webroot/こんとろーら/めそっど/ぱらめーた
2.Cakeのappふぉるだへのあくせす
- RewriteEngineをONにする。
- こんとろーらのしていのないURL(つまり、http://cake/appのぱすでよばれたばあい)には、「webroot/」とする(しょりしゅうりょう)。
- なにかしていされていれば、それをすべて、「webroot/」ののちについか。(しょりしゅうりょう)
http://cake/app/こんとろーら/めそっど/ぱらめーた
http://cake/app/webroot/こんとろーら/めそっど/ぱらめーた
3.Cakeの「app/webroot」ふぉるだへのあくせす
- RewriteEngineをONにする。
- URLでしていされたでぃれくとりがそんざいしているばあいにはしょりをちゅうし。
- URLでしていされたふぁいるがそんざいしているばあいにはしょりをちゅうし。
- していされているもじれつを
index.php?url=のかたちにしてついか。しょりちゅうし。
http://cake/app/webroot/こんとろーら/めそっど/ぱらめーた
http://cake/app/webroot/index.php?url=こんとろーら/めそっど/ぱらめーた
ここまでをまとめると、
http://Cakeのぱす/こんとろーら/めそっど/ぱらめーた
というかたちでりくえすとがあったばあい、Cakeのおやでぃれくとりと「app」でぃれくとりのどちらからでも、さいしゅうてきには、
http://Cakeのぱす/appでぃれくとり/webroot/index.php?url=こんとろーら/めそっど/ぱらめーた
というかたちにへんかんされることになります。ためしに、index.php?url=でちょくせつりくえすとしても、Cakeのぷろじぇくとはそのままうごきます。こののち、Dispacherくらすのdispachめそっどがこのぱらめーたをぶんかいしてひつようなでーたをそろえます。
http://cakeのぱす/index.php/こんとろーら/めそっど/ぱらめーた
dispatchのどうさ
dispatchめそっどのなかでは、まず、URLをぶんかいします。
function dispatch($url, $additionalParams=array()) { $params = array_merge($this->parseParams($url), $additionalParams);
ControllerのURLぶぶんから、こんとろーらめいをさくせいします。camelizeとは、あんだーばーをとりのぞき、かくたんごのせんとうもじをおおもじにするしょりです。
$ctrlName = Inflector::camelize($params['controller']); $ctrlClass = $ctrlName.'Controller';
Actionのしていがないばあいには、indexあくしょんがじっこうされます。また、__ではじまっているあくしょんはぷらいべーとなものとしてあつかわれます。
if (empty($params['action'])) { $params['action'] = 'index'; } if((in_array($params['action'], $classMethods) || in_array(strtolower($params['action']), $classMethods)) && strpos($params['action'], '_', 0) === 0) { $privateAction = true; }
このようにして、こんとろーらとあくしょんがきまると、しょりは、Controllerくらすのこーどがじっこうされます。Controllerくらすのこんすとらくたではもでるめいとびゅーのぱすをけっていします。Inflector::classifyは、「posts」から、「Post」をつくりだすめそっどです。「inflector.php」ふぁいるのなかには、めいめいきそくにそったなまえをつくりだすかんすうがいろいろとあります。
if ($this->viewPath == null) {
$this->viewPath = Inflector::underscore($this->name);
}
$this->modelClass = Inflector::classify($this->name);
$this->modelKey = Inflector::underscore($this->modelClass);
そののち、dispachは、$controller->constructClasses();として、Controllerくらすのかきのこーどをよびだします。これでひつようなもでるがよみこまれていきます。loadModel()は、「cake\basics.php」のなかにあります。
if ($this->uses) { $uses = is_array($this->uses) ? $this->uses : array($this->uses); foreach($uses as $modelClass) { : :しょうりゃく : if(!class_exists($modelClass)){ loadModel($modelClass); } : :しょうりゃく : } return true; }
いかがだったでしょうか。ふれーむわーくは「そうていない」のさぎょうではひじょうにすむーずにうごきますが、ふれーむわーく「そうていそと」のさぎょうをさせようとすると、そこからはだれもたいけんしたことのないみちのせかいです。おーぷんそーすぷろじぇくとのばあいはじぶんのぎもんにたいしてだれかがすべてこたえてくれるわけではありませんので、じりきでげんいんをついきゅうしかいけつするすきるもみがかなければなりません。そこからあらたなてくにっくがみつかるばあいもあります。ふれーむわーくのかいぜんあんをかんがえたらほうこくしてみましょう。ふれーむわーくのはってんをたすけることができるかもしれません。そして、きじをかいてみるとじぶんのりかいもふかめることができます。
/webroot/index.php?url=こんとろーら/めそっど/ぱらめーた




