【CakePHP2】「ブログチュートリアル - レイヤーの追加」を細かく理解する

公式でも詳細に説明があるお題ですが、一部は雰囲気だけでコピペしちゃった居ました。
また、本日から課題とは別にwebサービスを作って行くので、復習をかねて一行ごとに読み解きます。

命名規約は、CakePHP では非常に大切です。モデルを Post という名前にすることで、 CakePHP は自動的に、このモデルは PostsController で使用されるのだろうと考えます。 また、 posts という名前のデータベーステーブルと結びつけられます。

ここを明確に定義しないと、CakePHPは起動しない一番大切なところ。
簡単に規約通りに出してくれるサイト見つけたので貼っておきます。

/app/Controller/PostsController.php  

class PostsController extends AppController {
   public $helpers = array('Html', 'Form');
    public function index() {
       $this->set('posts', $this->Post->find('all'));
   }
}

>public $helpers = array('Html', 'Form');
ヘルパー使用宣言してます

ヘルパーはアプリケーションのプレゼンテーション層のためのコンポーネントのようなクラスです。 多くのビューやエレメント、レイアウトで共有される表示ロジックを含んでいます。 この章ではヘルパーの作り方と CakePHP のコアヘルパーでできる基本的なタスクの概要を説明します。

簡単にいうと「タグなどの出力を手軽に行う事ができる仕組み」
ローカル環境で打ったコードをサーバーにアップロードした時に、パスを置き換えてくれる便利なやつ

ヘルパーの設定と使用
CakePHP でヘルパーを有効にするにはコントローラに認識させる必要があります。各コントローラは $helpers プロパティを持っており、そのプロパティにはビューで 利用できるヘルパーの一覧が保持されています。ビューでヘルパーを使用するにはヘルパーの名前を コントローラの $helpers 配列に追加して下さい。

$helpersにプロパティを入れることによって、そのヘルパーが使用できる
$helpers = array('Html', 'Form');はHTML、FORMタグを作る

>$this->set('(viewに送る変数名)', $this->(テーブル名)->find('all'));
Viewへ送るデータの指定
Postテーブルから全て取得find('all')して、'posts'変数にして、Viewにデータを送る

<!-- File: /app/View/Posts/index.ctp -->
<h1>Blog posts</h1>
<table>
   <tr>
       <th>Id</th>
       <th>Title</th>
       <th>Created</th>
   </tr>
   <!-- ここから、$posts配列をループして、投稿記事の情報を表示 -->
   <?php foreach ($posts as $post): ?>
   <tr>
       <td><?php echo $post['Post']['id']; ?></td>
       <td>
           <?php echo $this->Html->link($post['Post']['title'],
array('controller' => 'posts', 'action' => 'view', $post['Post']['id'])); ?>
       </td>
       <td><?php echo $post['Post']['created']; ?></td>
   </tr>
   <?php endforeach; ?>
   <?php unset($post); ?>
</table>

そのViewのコードですが、上部は今までのPHPと同じコードで、、
$this->Html->link($post['Post']['title'],
array('controller' => 'posts', 'action' => 'view', $post['Post']['id']));
これですね、Htmlヘルパーを使用してます。
ここはlinkタグを作るよ!宣言ですね
HTMLタグでいう
<a href="cakephp/posts/view/〇〇">タイトル</a>
と同義です。

controllerは、postsで、viewは「$post['Post']['id']」のURLを指定しています。

// File: /app/Controller/PostsController.php
class PostsController extends AppController {
~~
   public function view($id = null) {
       if (!$id) {
           throw new NotFoundException(__('Invalid post'));
       }
       $post = $this->Post->findById($id);
       if (!$post) {
           throw new NotFoundException(__('Invalid post'));
       }
       $this->set('post', $post);
   }
}
<!-- File: /app/View/Posts/view.ctp -->
<h1><?php echo h($post['Post']['title']); ?></h1>
<p><small>Created: <?php echo $post['Post']['created']; ?></small></p>
<p><?php echo h($post['Post']['body']); ?></p>

個別記事を見るためのViewアクションの追加です。
if文で、記事にアクセスした時に渡されるPosts['id']があれば
Posts['id']のデータを$postに入れて、$postが定義されていたら、Viewに送ります。
間違ったURLからアクセスするとエラーになるように処理します。
View側はindex.ctpと同じですね

class PostsController extends AppController {
〜〜
   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.'));
               return $this->redirect(array('action' => 'index'));
           }
           $this->Flash->error(__('Unable to add your post.'));
       }
   }
}

if ($this->request->is('post')) {

requestプロパティにはブラウザからサーバーに送られた情報を管理するオブジェクトが入ってます。
上記だと、フォームからポストされたデータがあるかどうか

他にも様々なリクエスト方法があります、公式から一部引用します。

>POST データにアクセス
すべての POST データは CakeRequest::$data を使ってアクセスされます。 フォームデータが data 接頭辞を含んでいる場合、接頭辞は取り除かれるでしょう。例えば:
// name 属性が 'data[Post][title]' だった入力は次のようにアクセスします。
$this->request->data['Post']['title'];
>POST データにアクセス
すべての POST データは CakeRequest::$data を使ってアクセスされます。 フォームデータが data 接頭辞を含んでいる場合、接頭辞は取り除かれるでしょう。
// name 属性が 'data[Post][title]' だった入力は次のようにアクセスします。
$this->request->data['Post']['title'];

$this->Post->create();

Model::create(array $data = array())
このメソッドはデータを保存するためにモデルの状態をリセットします。 実際にはデータベースにデータは保存されませんが、 Model::$id フィールドが クリアされ、データベースのフィールドのデフォルト値を元に Model::$data の値を セットします。データベースフィールドのデフォルト値が存在しない場合、 Model::$data には空の配列がセットされます。

$data パラメータ (上記で説明したような配列の形式) が渡されれば、 データベースフィールドのデフォルト値とマージされ、モデルのインスタンスは データを保存する準備ができます (データは $this->data でアクセスできます)。

$data パラメータへ false や null が渡された場合、 Model::$data には空の配列がセットされます。

既存のレコードを更新するのではなく新しくレコードを追加したい時は、 最初に create() を呼び出してください。これによって、コールバックの中や 他の場所から save メソッドを呼び出した時に、事前にコンフリクトを 避けることができます。

 $this->Post->save($this->request->data)

$this->request->dataはポストされたデータを引っ張ってくる。でしたね、それを$this->Post->saveで保存
それが成功すれば成功メッセージを返しつつホーム画面へリダイレクト、失敗すれば、エラーを返す
以上がaddアクションの流れです。

<h1>Add Post</h1>
<?php
echo $this->Form->create('Post');
echo $this->Form->input('title');
echo $this->Form->input('body', array('rows' => '3'));
echo $this->Form->end('Save Post');
?>

Formヘルパーでフォームを作ってます

こんな感じですかね、復習しながら書いてみました。
今日もゴリゴリコード書きます!!!

この記事が気に入ったらサポートをしてみませんか?