CakePHP2.xのチュートリアル エラーと対応メモ
CakePHP2.3.2での開発をやることになった際に、とりあえず公式のチュートリアルをやっつけました。チュートリアルより古いバージョンというのもあり、ハマったりエラーを吐いたりしたので、対応をメモしておきます。
環境構築については以下の記事をどうぞ。 CakePHP2.xの環境構築 エラーと対応メモ
チュートリアル
公式チュートリアルを攻略すると、CakePHPの全てが完全に理解できます。そして実務でさらに理解を深めるにつれ、次第に何も分からなくなります。プログラミングとはそういうものです。
しかしまあやってみると、似たようなところで似たようなエラーを出している人がネットで質問したり解決策をメモしたものが大体見つかるので、その過程でなんとなく詰まったときにどこを見たらいいのかとか、勘所が分かってくる気がします。
エラーと対応
そんなわけで、自分がバージョン 2.3.2 でチュートリアルを進めた際のエラーと対応です。
※本来は本体のバージョンをあげるのが望ましいけど、現段階でそれをやると既存ソースが死にそうなど色々あってひとまずこのバージョンでやるぞという状況
文字化け
現象
チュートリアルに従って作成した Post ビューを見ると投稿のタイトルや本文の日本語が文字化けしている。
原因箇所
コマンドラインからMySQLを作成した際に文字コード(照合順序)がUTF-8になっていなかった。
対応
phpmyadminから照合順序をutf8_general_ci
にしてDBを作り直した。
投稿時のコンポーネント読み込みエラー
エラー内容
Error: Call to a member function success() on null
File: C:\xampp\htdocs\cake2\app\Controller\PostsController.php
原因箇所
class PostsController extends AppController {
public $helpers = array('Html', 'Form', 'Flash'); // FlashHelper
public $components = array('Flash'); // ←FlashComponent
public function index() {
$this->set('posts', $this->Post->find('all'));
}
public function view($id) {
if (!$id) {
throw new NotFoundException(__('Invalid post'));
}
$post = $this->Post->findById($id);
if (!$post) {
throw new NotFoundException(__('Invalid post'));
}
$this->set('post', $post);
}
public function add() {
if ($this->request->is('post')) {
$this->Post->create();
if ($this->Post->save($this->request->data)) {
$this->Flash->success(__('Your post has been saved.')); // Flash->success
return $this->redirect(array('action' => 'index'));
}
$this->Flash->error(__('Unable to add your post.')); // Flash->error
}
}
}
対応
「フラッシュ」はCakePHP 2.7 から追加されたコンポーネントなので、それ以前の環境では SessionComponent のsetFlash()
メソッドを使わねばならない。
投稿時のバリデーションエラー
エラー内容
preg_match(): Delimiter must not be alphanumeric or backslash [CORE\Cake\Model\Validator\CakeValidationRule.php, line 282]
原因箇所
入門 – 2.x – データのバリデーションclass Post extends AppModel {
public $validate = array(
'title' => array(
'rule' => 'notBlank'
),
'body' => array(
'rule' => 'notBlank'
)
);
}
対応
notBlank
はバージョン 2.7 で追加されたため、それ以前の環境ではnotEmpty
(バージョン 2.7 で撤廃)を使用。
データバリデーション – 2.x
逆にバージョン 2.7 以上でnotEmpty
を使用している場合も同様のエラーを吐くと思われます。
php – cakephp validation problem: Delimiter must not be alphanumeric or backslash – Stack Overflow
記事編集画面のエラー
エラー内容
strtolower() expects parameter 1 to be string, array given [CORE\Cake\Network\CakeRequest.php, line 477]
原因箇所
投稿記事の編集public function edit($id = null) {
if (!$id) {
throw new NotFoundException(__('Invalid post'));
}
$post = $this->Post->findById($id);
if (!$post) {
throw new NotFoundException(__('Invalid post'));
}
if ($this->request->is(array('post', 'put'))) {
$this->Post->id = $id;
if ($this->Post->save($this->request->data)) {
$this->Flash->success(__('Your post has been updated.'));
return $this->redirect(array('action' => 'index'));
}
$this->Flash->error(__('Unable to update your post.'));
}
if (!$this->request->data) {
$this->request->data = $post;
}
}
対応
$this->request->is(array('post', 'put'))
↓
$this->request->is('post') || $this->request->is('put')
is()
の所で、配列じゃなくて文字列にせよというエラーなので、文字列にします。下記記事の参考リンクを見るに、バージョン 2.4 からはis()
で配列を受け取れるようになっているっぽい。
Cakephp Blog Tutorial error – Stack Overflow
その他お役立ちソース
- グローバル定数およびグローバル関数 – 2.x ググって出てきたブログやらQiitaやらでサラッと出てくる定数の意味を検索。
- セキュリティ – 2.x セキュリティの基本はここを一読する
- ロギング – 2.x
デバッグする時にいろいろログに出力するやり方。たぶん最初はこれだけ覚えておけばいい?↓↓
// CakePHP クラス内でこれを実行: $this->log("何か動作しなかったよ!", 'debug');
おまけ:PHPやMySQlの基礎を学べる教材
上記では物足りない人向けに。自分がかつてやってみて良かったもの、評判の良いもの、興味のあるものなど。
PHPを学べる無料教材
そもそもPHPから学ぶ場合に無料でサクサクと学習できそうな教材を集めました。HTML/CSSが扱える前提で、他言語でも何かプログラミング経験は無いとゼロからはちょっと難しいかも。
- PHP: PHP マニュアル – Manual 公式のドキュメント。困ったらまずこれを見る。
- 無料初級試験対応教材 – PHP技術者認定機構 PHP技術者認定試験を運営するPHP技術者認定機構で初級試験対応の無料教材が配布されています。
- ゼロから始めるPHP入門 : DESIGNMAP 「PHP入門 確認画面付きのお問い合わせフォームをつくりながらPHPを学ぶ」というkindle本も出てます。
- PHP入門 (全30回) – プログラミングならドットインストール 入門編は全レッスン無料。
MySQLを学べる無料教材
XAMPPはコントロールパネル右の「Shell」を使うと黒い画面からMySQLにログインできます。
- MySQL :: MySQL Documentation 公式ドキュメント。英語。
- MySQL入門 (全36回) – プログラミングならドットインストール 無料になってる最初の5レッスンで超最低限の操作はすぐ分かる。
- MySQLの使い方 株式会社バズワード(@buzzword_info)さんが運営するレッスンサイト。