Asial Blog

Recruit! Asialで一緒に働きませんか?

Laravel5でシンプルなCRUDアプリを開発する

カテゴリ :
バックエンド(プログラミング)
タグ :
Tech
PHP
Laravel5
こんにちは〜たきゃはしです〜最近もホントにとにかくビール最高!って感じです!
今回はついにリリースされたLaravel5(以降はL5と略記する)を早速使ってみました!

◯ この記事の概要



L5の基本機能を扱いつつシンプルなブログアプリを作ってみようと思います。

こんな感じになります

この記事の目的はブログアプリの開発を通してL5でCRUDを作れるようになることです。構成をなるべくシンプルにしたかったこともあり沢山の機能は取り扱ったわけではありませんが「PHPやMySQLは分かるけどFWはよくわからないな〜」とか「Laravel5 気になってるんだよな〜」という人には特におすすめですよ!

さっそくインストールからはじめたいと思います。

◯ インストール



  1. $ composer create-project laravel/laravel l5blog --prefer-dist

l5blog というディレクトリを作成しインストールします
以降に登場するファイルパスはこの l5blog を基準とします。

◯ 初期設定



・ storageのパーミッションの変更



  1. $ chmod -R 777 storage

・ データベースの設定



・ .env
  1. DB_HOST=localhost
  2. DB_DATABASE=l5blog
  3. DB_USERNAME=root
  4. DB_PASSWORD=secret

データベースのドライバーはデフォルトで mysql です。
他のドライバーを使用したい場合は config/database.php で設定してください。

◯ データベースの作成



  1. mysql> CREATE DATABASE `l5blog`;

◯ マイグレーション



ここでいうマイグレーションとは、データベースのテーブルやカラムの追加や変更の定義を管理することを指します。

・ マイグレーションファイルの生成



  1. $ php artisan make:migration create_articles_table
  2. Created Migration: 2015_02_17_114821_create_articles_table

・ テーブル定義の作成



・ database/migrations/2015_02_17_114821_create_articles_table.php
  1. <?php
  2.   
  3.   use Illuminate\Database\Schema\Blueprint;
  4.   use Illuminate\Database\Migrations\Migration;
  5.   
  6.   class CreateArticlesTable extends Migration
  7.   {
  8.   
  9.       /**
  10.        * Run the migrations.
  11.        *
  12.        * @return void
  13.        */
  14.       public function up()
  15.       {
  16.           Schema::create('articles', function (Blueprint $table) {
  17.               $table->increments('id');
  18.               $table->string('title');
  19.               $table->text('body');
  20.               $table->timestamps();
  21.           });
  22.       }
  23.   
  24.       /**
  25.        * Reverse the migrations.
  26.        *
  27.        * @return void
  28.        */
  29.       public function down()
  30.       {
  31.           Schema::drop('articles');
  32.       }
  33.   
  34.   }

・ マイグレーションの実行



  1. $ php artisan migrate
  2. Migration table created successfully.
  3. Migrated: 2014_10_12_000000_create_users_table
  4. Migrated: 2014_10_12_100000_create_password_resets_table
  5. Migrated: 2015_02_17_114821_create_articles_table

これでデータベースに articles というテーブルが追加されました。
同時にいくつか追加されたテーブルがありますが今回使用しないため気にする必要はありません。

◯ シーダー(初期データ)



シーダーを生成するコマンドは標準でないので通常通りファイルを作成します。

・ 記事シーダーの作成



・ database/seeds/ArticlesTableSeeder.php
  1. <?php
  2.   
  3.   use Illuminate\Database\Seeder;
  4.   
  5.   class ArticlesTableSeeder extends Seeder
  6.   {
  7.   
  8.       public function run()
  9.       {
  10.           DB::table('articles')->truncate();
  11.   
  12.           DB::table('articles')->insert([
  13.               [
  14.                   'title'      => 'Laozi',
  15.                   'body'       => 'When there is no desire, all things are at peace.',
  16.                   'created_at' => '2015-01-31 23:59:59',
  17.                   'updated_at' => '2015-01-31 23:59:59',
  18.               ],
  19.               [
  20.                   'title'      => 'Leonardo da Vinci',
  21.                   'body'       => 'Simplicity is the ultimate sophistication.',
  22.                   'created_at' => '2015-02-01 00:00:00',
  23.                   'updated_at' => '2015-02-01 00:00:00',
  24.               ],
  25.               [
  26.                   'title'      => 'Cedric Bledsoe',
  27.                   'body'       => 'Simplicity is the essence of happiness.',
  28.                   'created_at' => '2015-02-01 00:00:01',
  29.                   'updated_at' => '2015-02-01 00:00:01',
  30.               ],
  31.           ]);
  32.   
  33.       }
  34.   
  35.   }

記事シーダーを作成したら下記のコマンドを実行してください。

  1. $ composer dump-autoload
  2. //もしくは
  3. $ php artisan optimize
※ 8egsさん、ご報告ありがとうございます!

・ database/seeds/DatabaseSeeder.php
  1. <?php
  2.   
  3.   use Illuminate\Database\Seeder;
  4.   use Illuminate\Database\Eloquent\Model;
  5.   
  6.   class DatabaseSeeder extends Seeder
  7.   {
  8.   
  9.       /**
  10.        * Run the database seeds.
  11.        *
  12.        * @return void
  13.        */
  14.       public function run()
  15.       {
  16.           Model::unguard();
  17.   
  18.           $this->call('ArticlesTableSeeder');
  19.       }
  20.   
  21.   }

・ シーダーの実行



  1. $ php artisan db:seed
  2. Seeded: ArticlesTableSeeder

デフォルトでDatabaseSeederが実行されるので記事データがインサートされます。
2回目以降であれば下記コマンドが便利です。

  1. $ php artisan migrate:refresh --seed
  2. Rolled back: 2015_02_17_114821_create_articles_table
  3. Rolled back: 2014_10_12_100000_create_password_resets_table
  4. Rolled back: 2014_10_12_000000_create_users_table
  5. Nothing to rollback.
  6. Migrated: 2014_10_12_000000_create_users_table
  7. Migrated: 2014_10_12_100000_create_password_resets_table
  8. Migrated: 2015_02_17_114821_create_articles_table
  9. Seeded: ArticlesTableSeeder

いよいよブログアプリの作成に進みます。

◯ 記事モデルの作成



はじめはモデルを作りましょう。

  1. $ php artisan make:model Article
  2. Model created successfully.

さっそく生成されたArticleモデルを確認してみます。

・ app/Article.php
  1. <?php namespace App;
  2.   
  3.   use Illuminate\Database\Eloquent\Model;
  4.   
  5.   class Article extends Model
  6.   {
  7.   
  8.       //
  9.   
  10.   }

モデルはappディレクトリ直下に生成されます。モデルがアプリの中枢を担うことになりますので妥当かもしれませんね。もちろん新たにModelディレクトリを作成してそこに配置してもLaravelでは何も問題ありません。

ひな形へ肉付けしていきます。

・ app/Article.php
  1. <?php namespace App;
  2.   
  3.   use Illuminate\Database\Eloquent\Model;
  4.   
  5.   class Article extends Model
  6.   {
  7.   
  8.       /**
  9.        * The table associated with the model.
  10.        *
  11.        * @var string
  12.        */
  13.       protected $table = 'articles';
  14.   
  15.       /**
  16.        * The attributes that are mass assignable.
  17.        *
  18.        * @var array
  19.        */
  20.       protected $fillable = ['title', 'body'];
  21.   
  22.   }

対応するテーブル名や保存が可能なフィールドを定義しました。(テーブル名はDRYに従っていれば実質不要なのですが明示的にするため記載しました。)
もし時間があるならばAricleモデルが継承している Illuminate\Database\Eloquent\Model を確認してみてください。他にどのようなプロパティが設定できるのか知っておくことは大切です。例えば今回定義しなかった「$perPage」はページネーションで1ページに表示する件数を指定することができます。

◯ コントローラー



コントローラーのひな形を生成します。

  1. $ php artisan make:controller ArticlesController
  2. Controller created successfully.

生成されたファイルはリソースコントローラーを前提とするアクションがずらっと定義されています。ですが今回は暗黙的コントローラーとして実装していきたいので一旦すべてのメソッドを削除してください。(暗黙的コントローラーについては後ほど簡単に説明します)

・ app/Http/Controllers/ArticlesController.php
  1. <?php namespace App\Http\Controllers;
  2.   
  3.   use App\Http\Requests;
  4.   use App\Http\Controllers\Controller;
  5.   
  6.   use Illuminate\Http\Request;
  7.   
  8.   class ArticlesController extends Controller
  9.   {
  10.   }

すっきりしたところで 一覧、詳細、作成、編集、削除 のアクションをそれぞれ定義していきます。

  1. <?php namespace App\Http\Controllers;
  2.   
  3.   use App\Article;
  4.   use App\Http\Requests;
  5.   use App\Http\Controllers\Controller;
  6.   
  7.   use Illuminate\Http\Request;
  8.   
  9.   class ArticlesController extends Controller
  10.   {
  11.   
  12.      /**
  13.       * @var Article
  14.       */
  15.      protected $article;
  16.   
  17.      /**
  18.       * @param Article $article
  19.       */
  20.      public function __construct(Article $article)
  21.      {
  22.          $this->article = $article;
  23.      }
  24.   
  25.      public function getIndex()
  26.      {
  27.   
  28.      }
  29.   
  30.      public function getShow()
  31.      {
  32.   
  33.      }
  34.   
  35.      public function getCreate()
  36.      {
  37.   
  38.      }
  39.   
  40.      public function postCreate()
  41.      {
  42.   
  43.      }
  44.   
  45.      public function getEdit()
  46.      {
  47.   
  48.      }
  49.   
  50.      public function postEdit()
  51.      {
  52.   
  53.      }
  54.   
  55.      public function postDelete()
  56.      {
  57.   
  58.      }
  59.   
  60.   }

暗黙的コントローラーでは、URIとHTTPメソッドで対応するアクションが決定します。上記ではgetCreate()とpostCreate()では対応するURIは同じになりますが対応するHTTPメソッドが異なります。またPATCHやDELETEといった他のHTTPメソッドにも対応可能ですが今回は割愛します。

◯ ルーティング



作成したコントローラーをルーティングへ追加します。
'/'へのアクセスは記事一覧、'/articles'は暗黙的コントローラーとして定義します。

・ app/Http/routes.php
  1. <?php
  2.   
  3.   Route::get('/', 'ArticlesController@getIndex');
  4.   Route::controller('articles', 'ArticlesController');

ここでコントローラーのネームスペースが指定する必要がないのは、 routes.php が App\Providers\RouteServiceProvider で読み込まれているためです。App\Providers\RouteServiceProviderで 'App\Http\Controllers' をネームスペースとするグループのルーティングだと定義されているおかげです。

◯ 記事の一覧



次に一覧の作成に取り掛かります。インサートした記事をすべて表示させましょう。
すべて記事を取得してビューへ渡すアクションを作成します。

・ 記事一覧アクション



  1. <?php ...
  2.  
  3.     /**
  4.      * 記事の一覧
  5.      *
  6.      * @return \Illuminate\View\View
  7.      */
  8.     public function getIndex()
  9.     {
  10.         $articles = $this->article->all();
  11.  
  12.         return view('articles.index')->with(compact('articles'));
  13.     }

view()の中身はドット繋ぎでディレクトリ構造を表現できます。with()にはビューで使いたいデータを配列で渡してあげればOKです。

次にビューを作成します。テンプレートエンジンはLaravelデファクトのBladeを使用します。
アプリらしくViewExtends、共通のビューと個別のビューを別々に作成します。

・ 共通のビュー



・ resources/views/app.blade.php
  1. <!DOCTYPE html>
  2.   <html lang="ja">
  3.   <head>
  4.       <meta charset="UTF-8">
  5.       <title>L5Blog</title>
  6.       <link href="/css/app.css" rel="stylesheet">
  7.   </head>
  8.   <body>
  9.       <div class="container">
  10.           <div class="row">
  11.               <h1>L5Blog</h1>
  12.               <div class="col-md-12">
  13.                   @yield('content')
  14.               </div>
  15.           </div>
  16.       </div>
  17.   </body>
  18.   </html>

・ 記事一覧のビュー(個別のビュー)



・ resources/views/articles/index.blade.php
  1. @extends('app')
  2.   
  3.   @section('content')
  4.       <h2 class="page-header">記事一覧</h2>
  5.       <table class="table table-striped table-hover">
  6.           <thead>
  7.           <tr>
  8.               <th>タイトル</th>
  9.               <th>本文</th>
  10.               <th>作成日時</th>
  11.               <th>更新日時</th>
  12.           </tr>
  13.           </thead>
  14.           <tbody>
  15.           @foreach($articles as $article)
  16.               <tr>
  17.                    <td>{{{ $article->title }}}</td>
  18.                    <td>{{{ $article->body }}}</td>
  19.                    <td>{{{ $article->created_at }}}</td>
  20.                    <td>{{{ $article->updated_at }}}</td>
  21.               </tr>
  22.           @endforeach
  23.           </tbody>
  24.       </table>
  25.   @endsection

ホストのルート'/'へアクセスしてみてください!一覧が表示されるはずです!

◯ 記事の詳細



次は記事の詳細を表示するページを作成していきます。

・ 記事詳細アクション



  1. <?php ...
  2.  
  3.     /**
  4.      * 記事の詳細
  5.      *
  6.      * @param $id
  7.      * @return \Illuminate\View\View
  8.      */
  9.     public function getShow($id)
  10.     {
  11.         $article = $this->article->find($id);
  12.  
  13.         return view('articles.show', compact('article'));
  14.     }

データはview()の第二引数から渡す方法もあります。

・ 記事詳細のビュー



・ resources/views/articles/show.blade.php
  1. @extends('app')
  2.   
  3.   @section('content')
  4.       <h2 class="page-header">記事詳細</h2>
  5.       <table class="table table-striped">
  6.           <tbody>
  7.           <tr>
  8.               <th>タイトル</th>
  9.               <td>{{{ $article->title }}}</td>
  10.           </tr>
  11.           <tr>
  12.               <th>本文</th>
  13.               <td>{{{ $article->body }}}</td>
  14.           </tr>
  15.           <tr>
  16.               <th>作成日時</th>
  17.               <td>{{{ $article->created_at }}}</td>
  18.           </tr>
  19.           <tr>
  20.               <th>更新日時</th>
  21.               <td>{{{ $article->updated_at }}}</td>
  22.           </tr>
  23.           </tbody>
  24.       </table>
  25.   @endsection

これで 'articles/show/2' へアクセスしてみてください!暗黙的コントローラーにより id:2 の記事の詳細が表示されます!

記事の一覧に詳細ページへのリンクを追加してみましょう。

・ resources/views/articles/index.blade.php
  1. @extends('app')
  2.   
  3.   @section('content')
  4.       <h2 class="page-header">記事一覧</h2>
  5.       <table class="table table-striped table-hover">
  6.           <thead>
  7.           <tr>
  8.               <th>タイトル</th>
  9.               <th>本文</th>
  10.               <th>作成日時</th>
  11.               <th>更新日時</th>
  12.               <th></th>
  13.           </tr>
  14.           </thead>
  15.           <tbody>
  16.           @foreach($articles as $article)
  17.               <tr>
  18.                    <td>{{{ $article->title }}}</td>
  19.                    <td>{{{ $article->body }}}</td>
  20.                    <td>{{{ $article->created_at }}}</td>
  21.                    <td>{{{ $article->updated_at }}}</td>
  22.                    <td><a href="/articles/show/{{{ $article->id }}}" class="btn btn-default btn-xs">詳細</a></td>
  23.               </tr>
  24.           @endforeach
  25.           </tbody>
  26.       </table>
  27.   @endsection

一覧から詳細リンクをクリックすると詳細ページに遷移されるようになりました。
Laravelが初めての方でもなんとなくイメージは掴めてきたでしょうか?

次は投稿処理です。

◯ 記事の投稿



投稿は一覧や詳細と違いPOSTを受け付けます。

- GET /articles/create の場合は getCreate()
- POST /articles/create の場合は postCreate()

上記を理解していればアクションとフォームで何をしなくてはいけないかハッキリしますね。

・ 記事投稿のアクション



  1. <?php ...
  2.  
  3.     /**
  4.      * 記事の投稿
  5.      *
  6.      * @return \Illuminate\View\View
  7.      */
  8.     public function getCreate()
  9.     {
  10.         return view('articles.create');
  11.     }
  12.  
  13.     /**
  14.      * 記事の投稿
  15.      *
  16.      * @param Request $request
  17.      * @return \Illuminate\Http\RedirectResponse
  18.      */
  19.     public function postCreate(Request $request)
  20.     {
  21.         $data = $request->all();
  22.         $this->article->fill($data);
  23.         $this->article->save();
  24.  
  25.         return redirect()->to('articles/index');
  26.     }

L5ではアクションなどでメソッドインジェクションによる依存性の注入が可能です。

・ 記事投稿のビュー



と、ここで問題発生です。

記事投稿用のフォームの作成をしていきますが、ワタクシここでハマりました。。。
L4ではFormクラスとHTMLクラスといういわゆるヘルパークラスがありそれを使おうとしてもなぜか使えずに悩んでいました。IDEでファサードが補完されない時点で「オヤ?」と思いサービスプロバイダーを確認したところ見当たらずロードされていないことに気が付きました。どうやらL5からFormクラスとHTMLクラスは統合されなくなったようで別途Composerによるインストールが必要なことが分かりました。

という訳で、あった方が便利なので準備します。

インストール


  1. $ composer require "laravelcollective/html:5.0.*"

サービスプロバイダーとファサードの追加


・ config/app.php
  1. <?php ...
  2.  
  3.     'Illuminate\Hashing\HashServiceProvider',
  4.     Collective\Html\HtmlServiceProvider::class,
  5.     'Illuminate\Mail\MailServiceProvider',

ファサードも変更します。

・ config/app.php
  1. <?php ...
  2.  
  3.     'File'      => 'Illuminate\Support\Facades\File',
  4.     'Form'      => Collective\Html\FormFacade::class,
  5.     'Hash'      => 'Illuminate\Support\Facades\Hash',
  6.     'HTML'      => Collective\Html\HtmlFacade::class,
  7.     'Input'     => 'Illuminate\Support\Facades\Input',

これでHTMLクラスとFormクラスの準備は完了です。
L4からやってる人はハマるだろうなぁと思いました。笑

※ L5.1 リリース頃にまたリポジトリが変わってしまったことの指摘があり修正しました。トイキン君さんありがとうございます。


気を取り直して、記事投稿ビューの作成です。

・ resources/views/articles/create.blade.php
  1. @extends('app')
  2.   
  3.   @section('content')
  4.       <h2 class="page-header">記事投稿</h2>
  5.       {!! Form::open() !!}
  6.           <div class="form-group">
  7.               <label>タイトル</label>
  8.               {!! Form::input('text', 'title', null, ['required', 'class' => 'form-control']) !!}
  9.           </div>
  10.           <div class="form-group">
  11.               <label>本文</label>
  12.               {!! Form::textarea('body', null, ['required', 'class' => 'form-control']) !!}
  13.           </div>
  14.           <button type="submit" class="btn btn-default">投稿</button>
  15.       {!! Form::close() !!}
  16.   @endsection

'/articles/create'へアクセスしてください!フォームが表示され投稿が可能になったはずです。

◯ 記事の編集



編集は既に投稿を作っているため特筆することがありませんが、せっかくなのでソースを見ないで自分で作ってみるのも理解への近道かもしれませんね。

・ 記事編集のアクション



  1. <?php ...
  2.  
  3.     /**
  4.      * 記事の編集
  5.      *
  6.      * @param $id
  7.      * @return \Illuminate\View\View
  8.      */
  9.     public function getEdit($id)
  10.     {
  11.         $article = $this->article->find($id);
  12.  
  13.         return view('articles.edit')->withArticle($article);
  14.     }
  15.  
  16.     /**
  17.      * 記事の編集
  18.      *
  19.      * @param Request $request
  20.      * @param         $id
  21.      * @return \Illuminate\Http\RedirectResponse
  22.      */
  23.     public function postEdit(Request $request, $id)
  24.     {
  25.         $article = $this->article->find($id);
  26.         $data = $request->all();
  27.         $article->fill($data);
  28.         $article->save();
  29.  
  30.         return redirect()->to('articles/index');
  31.     }

with()はマジックメソッドとしても利用可能です。
上記の withArticle($article) は with('article' => $article) と同じです。

・ 記事編集のビュー



・ resources/views/articles/edit.blade.php
  1. @extends('app')
  2.   
  3.   @section('content')
  4.       <h2 class="page-header">記事編集</h2>
  5.       {!! Form::open(['action' => ['ArticlesController@postEdit', $article->id]]) !!}
  6.           <div class="form-group">
  7.               <label>タイトル</label>
  8.               {!! Form::input('text', 'title', $article->title, ['required', 'class' => 'form-control']) !!}
  9.           </div>
  10.           <div class="form-group">
  11.               <label>本文</label>
  12.               {!! Form::textarea('body', $article->body, ['required', 'class' => 'form-control']) !!}
  13.           </div>
  14.           <button type="submit" class="btn btn-default">編集</button>
  15.       {!! Form::close() !!}
  16.   @endsection

編集ページヘの導線を作成しましょう。(先程の投稿もついでに)

・ resources/views/articles/index.blade.php
  1. @extends('app')
  2.   
  3.   @section('content')
  4.       <h2 class="page-header">記事一覧</h2>
  5.       <div>
  6.           <a href="/articles/create" class="btn btn-primary">投稿</a>
  7.       </div>
  8.       <table class="table table-striped table-hover">
  9.           <thead>
  10.           <tr>
  11.               <th>タイトル</th>
  12.               <th>本文</th>
  13.               <th>作成日時</th>
  14.               <th>更新日時</th>
  15.               <th></th>
  16.           </tr>
  17.           </thead>
  18.           <tbody>
  19.           @foreach($articles as $article)
  20.               <tr>
  21.                   <td>{{{ $article->title }}}</td>
  22.                   <td>{{{ $article->body }}}</td>
  23.                   <td>{{{ $article->created_at }}}</td>
  24.                   <td>{{{ $article->updated_at }}}</td>
  25.                   <td>
  26.                       <a href="/articles/show/{{{ $article->id }}}" class="btn btn-default btn-xs">詳細</a>
  27.                       <a href="/articles/edit/{{{ $article->id }}}" class="btn btn-success btn-xs">編集</a>
  28.                   </td>
  29.               </tr>
  30.           @endforeach
  31.           </tbody>
  32.       </table>
  33.   @endsection

これで編集も出来ましたね!最後は削除です。

◯ 記事の削除



もしGETで受け付けた場合は'/articles/delete/1'にアクセスした時点で削除されます。それは厳しいと思いますのでPOSTでのみ受け付けることにします。

・ 記事削除のアクション



  1. <?php ...
  2.  
  3.     /**
  4.      * 記事の削除
  5.      *
  6.      * @param $id
  7.      * @return \Illuminate\Http\RedirectResponse
  8.      */
  9.     public function postDelete($id)
  10.     {
  11.         $article = $this->article->find($id);
  12.         $article->delete();
  13.  
  14.         return redirect()->to('articles/index');
  15.     }

・ 記事削除のビュー



・ resources/views/articles/index.blade.php
  1. @extends('app')
  2.   
  3.   @section('content')
  4.       <h2 class="page-header">記事一覧</h2>
  5.       <div>
  6.           <a href="/articles/create" class="btn btn-primary">投稿</a>
  7.       </div>
  8.       <table class="table table-striped table-hover">
  9.           <thead>
  10.           <tr>
  11.               <th>タイトル</th>
  12.               <th>本文</th>
  13.               <th>作成日時</th>
  14.               <th>更新日時</th>
  15.               <th></th>
  16.           </tr>
  17.           </thead>
  18.           <tbody>
  19.           @foreach($articles as $article)
  20.               <tr>
  21.                   <td>{{{ $article->title }}}</td>
  22.                   <td>{{{ $article->body }}}</td>
  23.                   <td>{{{ $article->created_at }}}</td>
  24.                   <td>{{{ $article->updated_at }}}</td>
  25.                   <td>
  26.                       <a href="/articles/show/{{{ $article->id }}}" class="btn btn-default btn-xs">詳細</a>
  27.                       <a href="/articles/edit/{{{ $article->id }}}" class="btn btn-success btn-xs">編集</a>
  28.                       {!! Form::open(['action' => ['ArticlesController@postDelete', $article->id]]) !!}
  29.                       <button type="submit" class="btn btn-danger btn-xs">削除</button>
  30.                       {!! Form::close() !!}
  31.                   </td>
  32.               </tr>
  33.           @endforeach
  34.           </tbody>
  35.       </table>
  36.   @endsection

・ resources/views/articles/show.blade.php
  1. @extends('app')
  2.   
  3.   @section('content')
  4.       <h2 class="page-header">記事詳細</h2>
  5.       <ul class="list-inline">
  6.           <li>
  7.               <a href="/articles/edit/{{{ $article->id }}}" class="btn btn-primary pull-left">編集</a>
  8.           </li>
  9.           <li>
  10.               {!! Form::open(['action' => ['ArticlesController@postDelete', $article->id]]) !!}
  11.               <button type="submit" class="btn btn-danger pull-left">削除</button>
  12.               {!! Form::close() !!}
  13.           </li>
  14.       </ul>
  15.       <table class="table table-striped">
  16.           <tbody>
  17.           <tr>
  18.               <th>タイトル</th>
  19.               <td>{{{ $article->title }}}</td>
  20.           </tr>
  21.           <tr>
  22.               <th>本文</th>
  23.               <td>{{{ $article->body }}}</td>
  24.           </tr>
  25.           <tr>
  26.               <th>作成日時</th>
  27.               <td>{{{ $article->created_at }}}</td>
  28.           </tr>
  29.           <tr>
  30.               <th>更新日時</th>
  31.               <td>{{{ $article->updated_at }}}</td>
  32.           </tr>
  33.           </tbody>
  34.       </table>
  35.   @endsection

削除ボタンをクリックすればデータが削除されるようになりましたでしょうか?
確認ボックスもなしにイキナリ削除なんて驚いたと思いますが、これにてブログアプリは完成です!お疲れさまでした〜!

◯ まとめ



L5でブログアプリを開発してみましたがどうでしょうか?正直シンプルすぎる構成ゆえL5の魅力をお伝え出来たとは思っていません(自分も全然満足していません)。個人的に注目しているのは新しくなったバリデーション、扱いやすくなったサービスプロバイダー、モデルとルーティングのバインド、メソッドインジェクションによる依存性の注入、他にも様々な機能が盛りだくさんで正直一記事で説明するのは無理があると思いました。なので、それらも今後発信していけたらと思います。

記事のソースでエラーが出たとかあればコメントください!それでは〜!(ソースは欲しい方いれば公開します。)

コメント

  • anon

    テンプレートで、{{{ }}} って使えましたっけ?

  • たきゃはし

    >anonさん
    使えます!でもL4の時と少し変わりましたね!
    Illuminate\View\Compilers\BladeCompiler のそれらしい箇所をコピペしておきます!

    /**
    * Array of opening and closing tags for raw echos.
    *
    * @var array
    */
    protected $rawTags = array('{!!', '!!}');

    /**
    * Array of opening and closing tags for regular echos.
    *
    * @var array
    */
    protected $contentTags = array('{{', '}}');

    /**
    * Array of opening and closing tags for escaped echos.
    *
    * @var array
    */
    protected $escapedTags = array('{{{', '}}}');

  • anon

    使えるんですね。ありがとうございました!

  • 8egs

    seederのところで下記が必要な気が...

    composer dump-autoload

  • たきゃはし

    >8egsさん
    確かに確かに!ご報告ありがとうございます!
    Laravelだと php artisan optimize でOKですね!

  • 内藤

    ちょうどL5を勉強しはじめていたので助かります!

  • たきゃはし

    >内藤さん
    お役に立ててなによりです!

  • P3

    ソース公開してほしいですー!

  • たきゃはし

    >P3さん

    https://bitbucket.org/takahashiyuya/l5-blog/overview
    お待たせしました!ソースです!

  • しょまたん

    とても分かりやすくて助かりました!
    ありがとうございます(^_^)

  • aaa

    chmod 777 -R

  • たきゃはし

    >aaaさん

    どういう意味ですか!?

    $ chmod 777 -R huga
    chmod: -R: No such file or directory

    とエラーになるので再帰的に処理したい場合につける
    -R はアクセス権より先に書かないといけません。

    $ chmod -R 777 huga

    こういう話でいいんでしょうか??

  • トイキン君

    laravel5.1ltsで フォームヘルパーがなぜか上手くいかなかったので
    http://w.builwing.info/2015/05/20/laravel5%E3%81%A7%E6%96%B0%E8%A6%8F%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E4%BD%9C%E6%88%90/

    上記を参考にしていれました。

  • たきゃはし

    トイキン君さん>
    コメントありがとうございます。

    L5 で分離された illuminate/html と illuminate/form でしたが
    L5.1になった頃からさらに laravelcollective/html と laravelcollective/form に変更されました。
    現状L5でも laravelcollective にしないといけないので、記事も修正しておきます。

  • phantom

    質問です。

    記事を投稿・編集・削除した(submit)後に画面が切り替わりますが、
    URLがルートになってしまい、サブディレクトリに飛びません。

    [現状]
    http://192.168.0.1/articles/create

    http://192.168.0.1

    [希望]
    http://192.168.0.1/articles/create

    http://192.168.0.1/articles

    ルートに戻らずサブディレクトリに飛ばすには、どうしたら良いのでしょうか。

    よろしくお願い致します。

  • takahasi

    すみませんが、教えてください。
    全くの初心者なのですが、TOPは表示できました。→http://127.0.0.1/articles/
    投稿しようとすると、URLがhttp://27.120.80.142/articles/createとなり、404になります。
    Apacheの設定のドキュメントルートをどこにすれば よいのでしょうか?。

コメントフォーム



captcha_key

アシアルの会社情報

アシアル株式会社はPHP、HTML5、JavaScriptに特化したWebエンジニアリング企業です。ユーザーエクスペリエンス設計から大規模システム構築まで、アシアルメンバーが各々の専門性を通じてインターネットの進化に貢献します。

会社情報詳細

最近の記事