# Laravel基礎 ## アプリディレクトリを作成 テンプレート ``` composer create-project laravel/laravel アプリ名 --prefer-dist "バージョン" ``` 実際に実行するコマンド ``` composer create-project laravel/laravel blog --prefer-dist "6.*" ``` ## サーバーを起動 ``` php artisan serve --port=8080 ``` ## 言語と時間の変更 blog/config/app.php ```php= before 'timezone' => 'UTC', 'locale' => 'en', after 'timezone' => 'Asia/Tokyo' 'locale' => 'ja' ``` ## DB作成 ## DB設定 blog/config/database.php ```php= before 'strict' => false, after 'strict' => true, ``` ## LaravelとDBの接続設定と接続確認 接続先のDB名を入力する 隠しファイルが見当たらない場合はCloud9の設定を見直す blog/.env ``` DB_DATABASE=blog ``` 接続設定ができたら以下のコマンドを実行して、`users`, `password_resets`, `migrations`, `failed_jobs`のテーブルが作成されていれば成功 ``` php artisan migrate ``` phpMyAdminはリアルタイムで反映されないのでリロード必須 ## コントローラーを作成しよう ``` php artisan make:controller BlogController ``` blog/app/Http/Controllers内にBlogController.phpが作成されていれば成功です ## 作成したコントローラーにindexアクションを追加しよう blog/app/Http/Controllers内にBlogController.php ```php= public function index() { } ``` ## viewを作成しよう blog/resources/views内にblogというフォルダを作成し、そのフォルダの中にindex.blade.phpを作成しましょう index.blade.phpには ``` <h1>Hello World</h1> ``` を記述しましょう ## コントローラーからviewを呼び出せるようにしよう blog/app/Http/Controllers内にBlogController.php ```php= public function index() { return view("blog.index"); } ``` ## Blogコントローラーのindexアクションが呼び出せるようにしよう blog/routes/web.php ```php= Route::get("/blog", "BlogController@index"); ``` ここまでできたらサーバーを起動してプレビュー画面を開き、URLの末尾に`/blog`を追加して`Hello World`が表示されるか確認してみましょう ## モデルとマイグレーションファイルを作成しよう 以下のコマンドでモデルを作成することができます ``` php artisan make:model Models/Blog ``` 今回はマイグレーションファイルも同時に作成したいので`-m`をつけて実行します ``` php artisan make:model Models/Blog -m ``` blog/app/Models内にBlog.phpとblog/app/******_create_blogs_table.phpが作成されていれば成功です ## blogsテーブルを作成しよう blog/app/******_create_blogs_table.php内に以下の記述を追加し、 ```php= $table->text('content'); ``` ターミナルで以下のコマンドを実行してください ``` php artisan migrate ``` 正常に実行できたらphpMyAdminでblogsテーブルが作成されているか確認しましょう ## コントローラーからビューに値を受け渡せるようにしよう blog/app/Http/Controllers/BlogController.phpのindexアクション内に ```php= $word = "Laravel"; ``` を追記し、ビューを表示する部分を以下のように変更しましょう ```php= return view("blog.index", compact("word")); ``` 次に、blog/resources/views/blog/index.blade.phpを以下のように編集してください ```php= <h1>Hello {{$word}}</h1> ``` ここまでできたらプレビューを確認してみましょう ## 複数のデータをビューに渡してみよう blog/app/Http/Controllers/BlogController.phpのindexアクション内に`$data`という変数を用意し、その変数に`name`と`age`というキーにそれぞれ自分の名前と年齢をバリューにとして値を渡してみましょう ```php= $data = array( "name" => "Nabeshima" "age" => 24 ); ``` ビューを表示する部分を以下のように変更しましょう ```php= return view("blog.index", $data); ``` 次に、blog/resources/views/blog/index.blade.phpを以下のように編集してください ```php= <h1>My name is {{$name}}, {{$age}} years old.</h1> ``` ここまでできたらプレビューを確認してみましょう ## テーブルにデータを登録してみよう ## モデルを利用してテーブルのレコードを取得しよう ターミナルで以下のコマンドを入力してください(カレントディレクトリをblogにしておいてください) ``` php artisan tinker ``` `>>>`は入力を待っている状態なので、この後に ``` Blog::all(); ``` と入力してください そうするとblogsテーブル全てのレコードが取得できます 1件だけレコードを取得する場合は`find`を利用します findの引数にはテーブルに存在するidの数字を入れてください ``` Blog::find(2); ``` 仮に存在しないidを入れてみると ``` Blog::find(100) ``` `null`という結果になってしまいます tinkerの処理を抜けるには`exit`と入力してください モデルを利用してテーブルのデータを取得する方法がわかったので、今度はコントローラーでデータを取得するように記述していきます blog/app/Http/Controllers/BlogController.php内にBlogモデルを利用するための ```php= use App\Models\Blog; ``` を記述し、一度indexアクションないの処理を全て削除し以下のように修正してください ```php= $contents = Blog::all(); dd($contents); ``` `dd()`は`dd()`が実行された以降の処理を止めて、ブラウザ上で引数に渡した値の中身を確認することができます 一度この状態でプレビューを確認してみましょう 正常にテーブルからデータを取得できていることがわかったので、今度は取得したデータをビューに渡し、表示してみます inxexアクション内の ```php= dd($contents); ``` は削除してください ビューに値を渡すためにindexアクション内に ```php= return view("blog.index", compact("contents")); ``` を追記してください blog/resources/views/blog/index.blade.phpを以下のように編集してプレビューを確認してみましょう ```php= @foreach($contents as $content) <h1>{{$content->id}} {{$content->content}}</h1> @endforeach ``` ## モデルに受け取れる値を設定しよう blog/app/Models/Blog.phpに以下の記述を追記してください ```php= protected $fillable = ["contents"]; ``` これで`contents`という値を受け取る設定ができました それ以外の値を渡すと`MassAssignmentException`というエラーが発生します ## ターミナルからデータを登録してみよう 以下のコマンドを入力してください ``` php artisan tinker ``` `>>>`が表示されている状態で ``` Blog::create(["content" => "test"]); ``` を入力して実行してください データが追加されたかを確認するためにテーブル全てのデータを取得する処理を書いて実行してみます ``` Blog::all(); ``` idが4のデータがあれば正常にデータが追加されています `exit`でtinkerから抜けましょう ## 投稿フォームを作成しよう blog/resources/views/blogのなかにcreate.blade.phpを作成しましょう create.blade.phpには以下の内容を記述してください ```php= <form method="" action=""> @csrf <label for="content">コメント</label> <textarea id="content" name="content"></textarea> <button>送信</button> </form> ``` ## コントローラーからビューを呼び出せるようにしよう 先ほど作成したcreate.blade.phpをコントローラーから呼び出すには、まず、createアクションを作成する必要があります ビューの呼び出し方は今までと同じなのでまずは挑戦してみましょう blog/app/Http/Controllers/BlogController.php ```php= public function create(){ return view("blog.create"); } ``` ## URLでcreateアクションを呼び出せるようにしよう blog/routes/web.phpにURLの末尾が`/blog/create`になった時にBlogコントローラーのcreateアクションが動作するような記述を書いてみましょう ```php= Route::get("/blog/create", "BlogController@create"); ``` ルーティングの設定ができたらプレビューのURLの末尾を変更して確認してみましょう ## storeアクションを定義しよう 今までと同様にstoreアクションを定義してみましょう /blog/app/Http/Controllers/BlogController.php ```php= public function store(){ } ``` storeアクションはフォームで送信されてきた値を扱うため引数を取ります。 引数を取るときには以下の記述が必須です ```php= use Illuminate\Http\Request; ``` 次にstoreアクションの引数を設定します ```php= public function store(Request $request){ } ``` これでフォームに入力された値を受け取る設定が完了しました ## storeアクションをルーティングで呼び出せるようにしよう データを追加する際にはHttpメソッドはpostを使用します /blog/routes/web.php ```php= Route::post("/blog", "BlogController@store"); ``` getとpostは同じパスですが、Httpメソッドが違うので問題ありません ```php= Route::get("/blog", "BlogController@index"); Route::post("/blog", "BlogController@store"); ``` ## フォームを送信したときにstoreアクションが動作するようにしよう formタグのmethod属性とアクション属性にそれぞれ値をセットします /blog/resources/views/blog/create.blade.php ```php= <form method="POST" action="/blog"> @csrf <label for="content">コメント</label> <textarea id="content" name="content"></textarea> <button>送信</button> </form> ``` これで送信ボタンを押したときにBlogControllerのstoreアクションが動作するようになりました ## フォームに値を入力してstoreアクション内で確認してみよう `$request->name属性`と記述することでフォームから送信されてきた値を取得できます 今回値を入力したtextareaのname属性がcontentとなっているので、取得するときは`$request->content`となります デバッグをしながら値を確認したいので`dd()`を利用して確認してみましょう /blog/app/Http/Controllers/BlogController.php ```php= public function store(Request $request){ dd($request->content); } ``` [動画]() ## データを保存できるようにしよう storeアクション内でBlogモデルのインスタンスを作成し、そのインスタンスのプロパティにフォームで送信した値を代入します saveメソッドでデータを登録した後、store.blade.phpを表示できるようにしましょう(store.blade.phpはこのあと作ります) /blog/app/Http/Controllers/BlogController.php ```php= public function store(Request $request){ $blog = new Blog; $blog->content = $request->content; $blog->save(); return view("blog.store"); } ``` ## store.blade.phpを作成しよう /blog/resources/views/blog内にstore.blade.phpを作成し、以下のように記述してください ```php= <h1>登録が完了しました</h1> <a href="/blog">一覧に戻る</a> ``` これでstoreアクションが動作した後に表示されるビューの準備が整いました ## 一覧画面から投稿画面に移動できるようにしよう /blog/resources/views/blog/index.blade.phpの一番上に以下の記述を追記してください ```php= <a href="/blog/create">new</a> ``` ここまでできたら、 1. 一覧画面を表示 2. 投稿画面を表示 3. 投稿 4. 一覧画面に戻る を順番にやってみましょう