CakePHP2.xのチュートリアル エラーと対応メモ

CakePHP2.3.2での開発をやることになった際に、とりあえず公式のチュートリアルをやっつけました。チュートリアルより古いバージョンというのもあり、ハマったりエラーを吐いたりしたので、対応をメモしておきます。

環境構築については以下の記事をどうぞ。 CakePHP2.xの環境構築 エラーと対応メモ

    チュートリアル

    入門 – 2.x

    公式チュートリアルを攻略すると、CakePHPの全てが完全に理解できます。そして実務でさらに理解を深めるにつれ、次第に何も分からなくなります。プログラミングとはそういうものです。

    しかしまあやってみると、似たようなところで似たようなエラーを出している人がネットで質問したり解決策をメモしたものが大体見つかるので、その過程でなんとなく詰まったときにどこを見たらいいのかとか、勘所が分かってくる気がします。

    エラーと対応

    そんなわけで、自分がバージョン 2.3.2 でチュートリアルを進めた際のエラーと対応です。

    ※本来は本体のバージョンをあげるのが望ましいけど、現段階でそれをやると既存ソースが死にそうなど色々あってひとまずこのバージョンでやるぞという状況

    文字化け

    現象

    チュートリアルに従って作成した Post ビューを見ると投稿のタイトルや本文の日本語が文字化けしている。

    原因箇所

    入門 – 2.x – ブログデータベースの作成

    コマンドラインからMySQLを作成した際に文字コード(照合順序)がUTF-8になっていなかった。

    対応

    phpmyadminから照合順序をutf8_general_ciにしてDBを作り直した。

    投稿時のコンポーネント読み込みエラー

    エラー内容

    Error
    Error: Call to a member function success() on null
    File: C:\xampp\htdocs\cake2\app\Controller\PostsController.php
    

    原因箇所

    入門 – 2.x – 記事の追加

    CakePHP
    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()メソッドを使わねばならない。

    投稿時のバリデーションエラー

    エラー内容

    Error
    preg_match(): Delimiter must not be alphanumeric or backslash [CORE\Cake\Model\Validator\CakeValidationRule.php, line 282]
    

    原因箇所

    入門 – 2.x – データのバリデーション
    CakePHP
    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

    記事編集画面のエラー

    エラー内容

    Error
    strtolower() expects parameter 1 to be string, array given [CORE\Cake\Network\CakeRequest.php, line 477]
    

    原因箇所

    投稿記事の編集
    CakePHP
    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;
    	}
    }
    

    対応

    CakePHP
    $this->request->is(array('post', 'put'))
    

    CakePHP
    $this->request->is('post') || $this->request->is('put')
    

    is()の所で、配列じゃなくて文字列にせよというエラーなので、文字列にします。下記記事の参考リンクを見るに、バージョン 2.4 からはis()で配列を受け取れるようになっているっぽい。

    Cakephp Blog Tutorial error – Stack Overflow

    その他お役立ちソース

    おまけ:PHPやMySQlの基礎を学べる教材

    上記では物足りない人向けに。自分がかつてやってみて良かったもの、評判の良いもの、興味のあるものなど。

    PHPを学べる無料教材

    そもそもPHPから学ぶ場合に無料でサクサクと学習できそうな教材を集めました。HTML/CSSが扱える前提で、他言語でも何かプログラミング経験は無いとゼロからはちょっと難しいかも。

    MySQLを学べる無料教材

    XAMPPはコントロールパネル右の「Shell」を使うと黒い画面からMySQLにログインできます。

    シェア
    広告
    野良人 代表
    新免祥太
    1988年岡山生まれ。外食企業のWEB・EC担当を経験したのち、2013年12月より「野良人(のらんど)」の屋号で独立しWEBデザイン・プログラミングなどWEBサイト制作の工程全般を請け負っています。お気軽にご相談ください。
    <次の記事(2020/02/17)
    gulpのbrowsersyncでShift-JISファイルのオートリロードがうまく効かない時の対応
    前の記事>(2019/12/13)
    CakePHP2.xの環境構築 エラーと対応メモ
    記事一覧