localdisk

PHP とか Java とか Web とか好きなことを書きます。

CakePHPer のための Laravel 入門 - ブログチュートリアル2

CakePHPer のための Laravel 入門 - ブログチュートリアル1 - localdiskの続きです。

Postコントローラの作成

cake-to-laravel/app/controllers に 投稿記事(posts)に対するコントローラを作成します。

<?php
class PostController extends BaseController
{
    
}

全てのコントローラーは BaseController クラスを拡張する必要があります*1。では、一つメソッドを作って呼び出してみましょう。

<?php
class PostController extends BaseController
{
    public function getIndex()
    {
        // URL を echo する
        echo Request::url();
    }

}

コントローラを呼び出すのにはルートの定義が必要です。cake-to-laravel/app/routes.phpを以下のように編集します。

<?php
// コントローラを登録
Route::controller('posts', 'PostController');

では、http://localhost:8000/posts/indexをブラウザでアクセスしてみましょう。アクセスした URL が表示されるはずです。

次は前回作成したモデルを表示させてみましょう。コントローラを以下のように編集します。

<?php
class PostController extends BaseController
{
    public function getIndex()
    {
        return View::make('posts.index', ['posts' => Post::all()]);
    }

}

Post ビューの作成

Post モデルの内容を表示するシンプルなビューを作りましょう。ビューの設置場所は cake-to-laravel/app/views になります。今回はそこに posts というフォルダを作ってその中に index.php というファイルを作りましょう。

<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->id; ?></td>
            <td>
                <!-- link_to_action を使うと定義されていなければエラーになる -->
                <?php echo link_to("posts/view/{$post->id}", $post->title) ?>
            </td>
            <td><?php echo $post->created_at ?></td>
        </tr>
    <?php endforeach; ?>
</table>

シンプルですよね。煩わしい配列がないところが特に。
ビューの中のリンク(投稿記事のタイトルから/posts/view/some_idというURLへのリンク)をクリックすると、Laravelは、そのアクションはまだ定義されていません、エラー画面を表示します。*2
では、エラーを撲滅するべく表示用のメソッドを実装しましょう。

<?php
class PostController extends BaseController
{
    public function getIndex()
    {
        return View::make('posts.index', ['posts' => Post::all()]);
    }
    
    public function getView($id)
    {
        // この状態だと $id が URL に付加されてない場合は ErrorException が発生する
        // $id あってもなくてもよい場合は getView($id = null) とすればよい
        // Model::findOrFail を使うとモデルが見つからなかった場合
        // ModelNotFoundException を発生させる
        return View::make('posts.view', Post::findOrFail($id));
    }
}

記事の追加

続きはあとで。

*1:実際は Controller クラスを継承していればよい

*2:NotFoundHttpExceptionが発生します