「CakePHPでSNSっぽいものをつくって挫折するまでのコーディング日記」へツッコミをいれていきます

こんにちは。青い人です。

百式の中の人の個人ブログで「CakePHPでSNSっぽいものをつくって挫折するまでのコーディング日記」が始まりました。(挫折前提にしなくてもw)

SS

なんだか面白そうなのでツッコミをいれていきたいと思います。

MVCとActiveRecordのざっくり説明

まずは#001から。

ActiveRecordとか何いってるかわかんない。あとぶっちゃけ、モデル、ビュー、コントローラーのビューしかわかんない。

今回のSNSアプリであれば、モデルの多くは「DBへのアクセス抽象化するもの」になるはずです。コントローラーは「リクエストを処理する一連の流れ」を書くもので、「GETやPOSTの値をモデルに値を渡したり」「モデルから取得した値をビューに渡したり」するものになるはずです。

なるはず、というのは、書き方によっては様々だからです。コントローラーの処理の共通化のためにモデルにロジック的なコードを書くこともあり得るので、そこのところは「同じコードを何度も書かなくていいように効率よく書く」ことを意識して書けばよいです。

ActiveRecordについてはとりあえずは「DBへのアクセスを抽象化する一つの手法の名前」として認識しておけばいいことにします。CakeがActiveRecordかどうかは知らなくても問題なく開発できます。

ビューファイルの拡張子がthtmlなわけと、変更方法

Viewのファイル名が.thtmlなのがちょっと気持ち悪い。なんで「.thtml」なんだ?

憶測ですが「Template HTML」の略かなと。この拡張子名は変更できます。コントローラーのメンバ変数 $ext に変更したい拡張子名を書けば変更完了です。

以下サンプルです。

<?php
class DiariesController extends AppController {
var $name = 'Diaries';
var $ext  = '.html';
...

ビューに処理が移る前に設定されていればよいので、以下でもOKです。

<?php
class DiariesController extends AppController {
var $name = 'Diaries';
function index() {
$this->ext = '.html';
}
}

DB接続情報の設定

#002へ続きます。

同じ設定ファイル内に$testがあったけどそれはそのままでいいのか?

単なる設定なので放っておいても直接的な影響はありません。あとあとのセキュリティのことを考えると削除しておいたほうがよいかもしれませんね。

また'connect'は'mysql_pconnect'でいいのかな?いまいち違いがわかっていない・・・。

練習ならmysql_pconnectでとりあえずは大丈夫です。ただし実運用のときはmysql_connectの方が無難かもしれません。というのは、Cakeで作るようなWebアプリケーションで接続のオーバーヘッドがシリアスになる場面はなかなかお目にかかれないと個人的に思うからです。

mysql_pconnectの詳細はPHP: mysql_pconnect - Manualをどうぞ。

文字コードはUTF-8でOK

続いて#003です。

どうでもいいけど文字コードはUTF-8でいいのかな。ま、大丈夫でしょ。

大丈夫です。むしろしがらみが無ければUTF-8でいっときましょう。

大量エラーの原因はパーミッション設定。そしてごめんなさい

さてここまでできたので、http://www.codexcode.com/diariesにアクセスします。どうなるやら・・・。

SS

↑ エラーでした・・・orz。

えー・・・つか、あれですな。なんか書き込みするんですな。面倒なんでpublic_html以下を全部777に(これって横暴かな?>教えて青い人

これはちょっと僕の記事の説明がまずかったです。ファイルを設置後にapp/tmpディレクトリ以下は書き込みできるようにしておく必要がありました。ごめんなさい。僕もたまに設定し忘れます。これもCake側でエラーを出しておいてもらえると敷居が下がっていいですね。パッチ送ってみようかな...。

というわけで、app/tmp以下だけをWebサーバーが書き込みできるようにパーミッションを設定してください。ローカルの練習用であれば707か777でよいでしょう。

ちなみにpublic_html以下を全部777にしてしまうのはセキュリティ上の危険度を急上昇させますので、しないほうが懸命です。ローカルでもPCやディレクトリを共有していた場合誰でも読み書きできてしまいます。

デフォルトでは自動でビューを表示します

問題は単にViewがなかっただけでした・・・ちゃんとエラーメッセージ読めよ・・・。

CakePHPはデフォルトではコントローラーの処理が終わったら自動でコントローラー名とアクション名に対応したビューを読み込みます。http://example.com/diariesであれば、app/views/diaries/index.thtmlです。(アクション名を指定しない場合はindexが呼ばれます)

自動でビューを表示したくないときは、メンバ変数 $autoRender に false を設定しておきましょう。コントローラクラスで var $autoRender = false; しておいてもいいですし、アクション処理中に $this->autoRender = false; としてもよいです。

自動表示を停止したときに手動でビューを表示するときは $this->render() で表示します。$this->render('ファイル名') で表示したいビューファイルを指定することもできます。ビューファイルの指定は自動表示が有効のときでも機能します。

renderについてもっと詳しく知りたい方はCakePHP プログラマーズ リファレンスガイド7.2. コントローラの関数をどうぞ。

今回はここまでです。

コメント / トラックバック

コメント / トラックバック 2 件

  1. yoppe より:

    var $ext = '.html';
    こんな変数もあったんですねー。
    初めて知った。
    多分これを設定する場合は全体で共通にしたいと思うので、AppControllerに記述する例も追加するとなお良いかと思われます。

  2. cakeman より:

    初めまして!cakemanと申します。
    いきなりなんですが百式さんに勇気付けられて自分も昨日始めたばっかりのCAKEで何かサイトを作ろうと考えています。

    すっごくヒマーな時で結構ですのでチラッと1秒だけでも見てやって下さいませ