(゚д゚)ノこんばんわ、中の人デスヨ。
(´Д`;)ブログ掛け持ちすると更新がryになるのが困る。
でぁ引き続きcakePHPのコントローラーについてやっていきますよ。
_,,:-ー''" ̄ ̄ ̄ `ヽ、
,r'" `ヽ.
__,,::r'7" ::. ヽ_
゙l | :: ゙) 7
| ヽ`l :: /ノ )
.| ヾミ,l _;;-==ェ;、 ,,,,,,,,,,,,,,,_ ヒ-彡|
〉"l,_l "-ー:ェェヮ;::) f';;_-ェェ-ニ ゙レr-{ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
| ヽ"::::''  ̄´.::;i, i `'' ̄ r';' } | 久々にワロタ
. ゙N l ::. ....:;イ;:' l 、 ,l,フ ノ | 毎日更新してた
. |_i"ヽ;:...:::/ ゙'''=-='''´`ヽ. /i l" < のが昔の俺なんだよな 今の俺は
.| ::゙l ::´~===' '===''` ,il" .|'". | 更新が遅いから困る
.{ ::| 、 :: `::=====::" , il | \________
/ト、 :|. ゙l;: ,i' ,l' ノト、
/ .| \ゝ、゙l;: ,,/;;,ノ;r'" :| \
'" | `''-、`'ー--─'";;-'''" ,| \_
困る。
cakePHPで実際に動かす際に重要になるのがMVCのうちのCにあたるコントローラーだ。
コントローラーがないとWEBアプリ自体が動かない。まさに困る。
ビューもなければ表示されないが、ぶっちゃけコントローラーにechoを書くという荒業さえしてしまえば問題ない。
最後のモデルについてはDBを使わないならイラン。まずは基本的なところから解説していくのでモデルは後回しになる悪寒。
とりあえずちゃちゃっとコントローラーを作っていきますYO!!
『app』フォルダ内の『controllers』内にファイルをつくりますYO
ファイル名は「test_controller.php」。
<?php
class testController extends AppController{
public $name = 'test';
public $uses = null;
public $autoRender = false;
function index(){
echo "<html><body>";
echo "<div>これは、テスト用コントローラーによるindexアクションの表示です。</div>";
echo "</body></html>";
}
}
?>
{の位置とか間違えないように注意。
保存したら、http://localhost/cakeapp/test へレッツアクセスヽ( ^ω^)ノ サクセス!
とりあえずファイルを保存する際にはUTF-8でBOMなしで保存汁。
では解説。
<?php
class testController extends AppController{
public $name = 'test';
public $uses = null;
public $autoRender = false;
function index(){
echo "<html><body>";
echo "<div>これは、テスト用コントローラーによるindexアクションの表示です。</div>";
echo "</body></html>";
}
}
?>
まずcakePHPでは"名前"がかなり重要な役目を果たします。
とろあえずその辺は後述しますが。
まずコントローラーは、名前_controller.phpという形式のファイル名で保存します。
そこに名前Controolerというクラスを配置して作成する決まりになっています。
□□_controller.php
class □□Controller extends AppController{
function index(){
デフォルトの処理
}
メソッド***
}
コントローラーは必ず「AppController」というクラスを継承して作成します。また、クラス内にはデフォルトで呼び出される「index」というメソッドを用意しておきます。これは通常引数も返り値もないシンプルなメソッドとして定義しておきます。
この基本形にメソッドを追加してコントローラーを作成していきます。
ひとつ注意として、処理がないからといってメソッドを削除してはならない、という点があります。
メソッドを削除すると、"そのアクションそのものがない"と判断されてしまいます。
何も処理がなければ、空のメソッドを用意します。メソッド自体を消しちゃダメです。
WEBブラウザからアクセスをする場合、アドレスは「名前」と「アクション」の組み合わせになります。
http://サーバー/CakePHPディレクトリ/名前/アクション
今回の環境(XAMPP)では、サーバが"localhost"でディレクトリは"cakeapp"、名前は"test"でアクションはなし。
このように名前を指定したアドレスにアクションの指定がない場合、デフォルトでは"index"というメソッドが実行されます。これはWEBサーバにアクセスした際に何も指定しないと"index.html"が呼び出されるという仕組みと同じです。
でぁこの「アクション」とは何なのか。
それは、"その名前での様々な動作や処理を示すもの"と考えてください。
例えば、あるデータを扱うコントローラーの中で、「データを表示する」「フォームからデータを受け取る」「データを追加する」といったような複数の種類の処理を扱う際にそれぞれの機能のアクションを用意します。
言ってしまえばアクションを指定することでコントローラーの中の「データを一覧表示する」機能を呼び出したり「データを追加する」機能を呼び出したりすることができる。つまり自分の意図した機能を呼び出す為の値とでも理解すればいいと思います。
cakePHPではそれぞれのアクションが実行されると、コントローラーの中でそのアクションに対応するメソッドが実行されるようになっています。
アクションに対応するメソッドですから、これを「アクションメソッド」と呼んだりします。
今回はtestControllerクラスにindexアクションメソッドを定義したということになります。
このようにコントローラーの作成というのはアクションメソッドを定義して様々なアクションごとの処理を実装していくという、というのが基本です。
今回はただ単にメソッドを実行するだけで終わりですが通常だとメソッド終了後にビューが呼ばれてクライアント側に送り返されるのです。
要はアクションは「コントローラーに用意されたメソッドを実行し、対応するビューを生成して返信する」といった一連の流れを示すものだと考えてください。
何か新しい画面を作成する。そのためのアクションを設計士、アクションメソッドとビューを用意する―それがcakePHPにおける基本的な開発の流れになります。
それでは↑で触れた名前に関する解説を。
名前の付け方は、cakePHPにおける基本となります。
cakePHPの基本思想は「設定よりも規約!」というスタンスをとっています。
cakePHPの場合、個々のコントローラーやビュー、モデルの動作に関する設定などは一切記述しません。
でぁ、cakePHPはどうやって「ここはどこのコントローラーを使い制御を行い、どのアクションでどのビューを、モデルを使ってDBへアクセスするのか。」ということを知るのか。
cakePHPではMVCそれぞれの名前の命名規則が定められています。つまり、その規則にしたがって命名したファイルを用意することで使われるコントローラーやビュー等がcakePHP側で勝手に判断し、自動的に認識されるのです。
では、以下でcakePHPの命名規則について説明します。
MVCのファイル名の命名規則
コントローラー:[名前]_controller.php
ビュー:[名前のフォルダ]/[アクション].ctp
モデル:[DBのテーブル].php
コントローラーは名前の横に「_controller」とつけたファイル名に。ビューはその名前のフォルダを用意し、その中にそれぞれのアクション名のファイルを作成します。ビューは独自のテンプレートファイルとして用意するので拡張子はctpとなります。
MとCのクラス名の命令規則
コントローラークラス:[名前]Controller
モデルクラス:[テーブル]
コントローラーは名前の後に「Controller」と続けたクラス名になります。
モデルクラスは、テーブル名をそのままクラス名とします。尚ビューはクラスとしては定義しません。
ファイル名はアンダースコア記法
名前が複数の単語を組み合わせたような形になっている場合、ファイル名は「アンダースコア記法」と呼ばれる形式で記述されます。
これはそれぞれの単語をすべて小文字にし、それぞれをアンダースコアでつなげて一単語にまとめたものです。
例えば「nakaProject」の場合、コントローラーのファイル名は「naka_project_controller.php」となります。
クラス名、メソッド名はキャラメル記法
クラス名やその中で定義するメソッド名は、一般に「キャラメル記法」と呼ばれる形式で記述します。
これは複数の単語があった場合、それぞれの最初の文字だけを大文字にし、その他すべてを小文字にするものです。
例えば「nakaProject」という命名にしたい場合にコントローラークラス名は「NakaProjectController」となります。
PHPでは原則として"クラス名は大文字で始まり、メソッドやメンバー変数は小文字で始まる"という名づけ方がされますが、このことはキャラメル記法でも同様です。例えば「This Name」はクラス名なら「ThisName」、メソッド名なら「thisName」となります。
テーブル名・名前は複数形。
ただし、モデル使用時のみつぎの決まりになります。
それは、DBにあるテーブルを利用する場合には、テーブル名を名前としてつける(つまりテーブル名と名前が同じになる)、という規則です。
テーブル名は通常複数形で名づけます。
テーブルが「Books」なら「Books」という名前になり、コントローラーは「books_controller.php」というファイル名になりモデルは「books.php」に、モデルクラスは「Books」というようにテーブル名が決まると順次決まっていきます。
次にコントローラーのメンバ変数について解説。
先ほど作成したコントローラーには、3つのメンバー変数
public $name = 'test';
public $uses = null;
public $autoRender = false;
が設定されていました。このメンバー変数について解説していきます。
まず$nameですが、コントローラークラスではこのように最初に「$name」というメンバー変数に値を設定しています。これはこのコントローラーの名前を指定するものです。これは、実はcakePHP1,1時代に必要とされていたもので、現在の1,2では特に必要ではなくなったみたいです。(ただし名前をデフォルトのものとは異なるものに変更する場合等に利用することはあります。)
つぎに$uses。これはここで使用するモデルの指定になります。ここではヌルポ(゚д゚)ガッ が指定されています。
ここで値を設定しておくと、コントローラー内のメソッド類が実行される際にはすべて設定された値に基づいて使用されるモデルが決まります。今回は使用していないのでヌリポ(゚д゚)ガッ!!になっているわけです。
つぎに$autoRender。
cakePHPではクライアントに表示を送信する際ビューとして用意されているファイルを読み込んでそれを基にしてレンダリングして画面表示用のHTMLを生成しています。
ビューのデータは純粋なHTMLのみで書かれているわけではないので一度読み込んでHTML形式に翻訳する必要があるわけです。
cakePHPでアクションが送られるとコントローラー内の対応するアクションメソッドが呼び出される訳ですが、その処理が終わるとcakePHPは自動的にそのアクション用に用意されたビューを読みこんでレンダリングし、クライアントに送り返します。
これが自動レンダリング機能というものです。
今回はビューは使わずコントローラーのみで出力を行っているので、この自動レンダリング機能は偽になっているわけです。
ではindexとアクションの基本がわかったところで別のアクションをコントローラーに呼び出して実行してみませう。
<?php
class testController extends AppController{
public $name = 'test';
public $uses = null;
public $autoRender = false;
function index(){
echo "<html><body>";
echo "<div>これは、テスト用コントローラーによるindexアクションの表示です。</div>";
echo "</body></html>";
}
}
?>
↑を↓のように修正。
<?php
class testController extends AppController{
public $name = 'test';
public $uses = null;
public $autoRender = false;
function index(){
echo "<html><body>";
echo "<div>これは、テスト用コントローラーによるindexアクションの表示です。</div>";
echo "<br/><a href=\"other\">otherアクションを呼び出す</s>";
echo "</body></html>";
}
function other(){
echo "<html><body>";
echo "<div>これはotherアクションの表示です。</div>";
echo "<br/><a href=\"index\">indexアクションに戻る</a>";
echo "</body></html>";
}
}
?>
以上のように修正したら、http://localhost/cakeapp/test/index へレッツアクセスヽ( ^ω^)ノ サクセス!
otherリンクを押下後。このようにアクションメソッドによって処理が変わる。
以上軽く流したところでコントローラー・アクション部分は終了。
/ :::::::\
.| .::::|
| '''''' '''''' .:::|
.|(●), 、(●)、::::|
\ ,,ノ(、_, )ヽ、,,.:::::/
/``ーニ=-'"一´\
_/((┃))_____i |_ キュッキュッ
.. / /ヽ,,⌒) ̄ ̄ ̄ ̄ (,,ノ \
/ /_________ヽ.. \
. ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
/\___/ヽ
/'''''' '''''':::::::\
. |(●), 、(●)、.:| +
| ,,ノ(、_, )ヽ、,, .::::|
. | `-=ニ=- ' .:::::::| +
\ `ニニ´ .:::::/ +
/ヽ、ニ__ ーーノ゙\_
.| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄.| トン
_(,,)TO BE (,,)_
.. /. |..CONTINUED!! | \
/ .|_________| \

