教材の内容に関係のない質問や教材とは異なる環境・バージョンで進めている場合のエラーなど、教材に関係しない質問は推奨していないため回答できない場合がございます。
その場合、teratailなどの外部サイトを利用して質問することをおすすめします。教材の誤字脱字や追記・改善の要望は「文章の間違いや改善点の指摘」からお願いします。
前パートでは、URLと処理内容のひも付けを行いました。
この処理内容をもう一段詳しく定義するのがコントローラーになります。
(なお、処理の内容によっては、さらに別の適したクラスへ処理を引き渡すといったことを行うのもコントローラーの役割です)
Laravelでは、コントローラーをapp/Http/Controllers
ディレクトリに作成します。
本パートではコントローラーを新規に作り、さらに記事一覧のビュー(画面の見た目)を呼び出すindex
アクションメソッドを定義します。
なお、本来は記事一覧の情報をデータベースの記事テーブルから取得してビューに渡す必要がありますが、本パートの段階ではダミーの固定データを渡すようにします。
Laravelでは、コマンドでコントローラーのひな形を作成することができます。
laradock
ディレクトリで、以下のコマンドを入力してください。
Copied!$ docker-compose exec workspace php artisan make:controller ArticleController
以上により、app/Http/Controllers
ディレクトリにArticleController.php
が作成されます。
なお、今回実行したコマンドの先頭に付いているdocker-compose exec workspace
の意味は、
workspace
という名前のDockerコンテナ(仮想環境)の中で、続くコマンド(php artisan...
)を実行してくださいといったものになります。
Laravelでコントローラーのひな形を作成するためのコマンドそのものはphp artisan make:controller コントローラー名
となります。
今回も含め、今後登場するコマンドの先頭にdocker-compose exec...
が付いているのは、本教材がDocker Composeという仕組みを使って開発環境を構築しているためなので、その点についてご注意ください。
次に、laravel/app/Http/Controllers/ArticleController.php
を以下の内容に編集してください。
Copied!.
└──laravel
└── app
└── Http
└── Controllers
└── ArticleController.php
laravel/app/Http/Controllers/ArticleController.php1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950 Copied!<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class ArticleController extends Controller
{
//==========ここから追加==========
public function index()
{
// ダミーデータ
$articles = [
(object) [
'id' => 1,
'title' => 'タイトル1',
'body' => '本文1',
'created_at' => now(),
'user' => (object) [
'id' => 1,
'name' => 'ユーザー名1',
],
],
(object) [
'id' => 2,
'title' => 'タイトル2',
'body' => '本文2',
'created_at' => now(),
'user' => (object) [
'id' => 2,
'name' => 'ユーザー名2',
],
],
(object) [
'id' => 3,
'title' => 'タイトル3',
'body' => '本文3',
'created_at' => now(),
'user' => (object) [
'id' => 3,
'name' => 'ユーザー名3',
],
],
];
return view('articles.index', ['articles' => $articles]);
}
//==========ここまで追加==========
}
前パートでは、以下のようにルーティングを定義しました。
php123 Copied!<?php
Route::get('/', 'ArticleController@index');
このArticleController@index
のindex
の部分が、ArticleController.php
のindex
アクションメソッドに対応します。
本来、index
アクションメソッドでは記事情報をデータベースのarticles
テーブル(記事テーブル)から読み込む必要があります。
ただし、まだarticles
テーブルを作成していないので、この段階ではarticles
テーブルの内容を模したデータを変数$articles
に代入しています。
php12345678910111213 Copied!// ダミーデータ
$articles = [
(object) [
'id' => 1,
'title' => 'タイトル1',
'body' => '本文1',
'created_at' => now(),
'user' => (object) [
'id' => 1,
'name' => 'ユーザー名1',
],
],
// 以下略
(object)
は、型キャストと呼ばれるものです。
ここでは、配列の手前に(object)
と記述することで、配列がオブジェクト型に変換されています。
データベースのテーブルから読み込んだデータは、Laravelではオブジェクト型として扱われるので、このような型変換を行なっています。
本パートの段階では、PHPには型キャストという仕組みがあるということだけ頭の片隅に入れておいてください。
index
アクションメソッドでは、以下の通り、view
メソッドの結果をアクセス元に返しています。
php1 Copied!return view('articles.index', ['articles' => $articles]);
view
メソッドの第一引数には、ビューファイル名を渡します。
'articles.index'
とすることで、resources/views/articles
ディレクトリにある、index
という名前のビューファイルが表示されます。
(現時点ではresources/views
ディレクトリには、articles
ディレクトリもindex
というビューファイルも作成していないので、次のパートで作成します)
view
メソッドの第二引数には、ビューファイルに渡す変数の名称と、その変数の値を連想配列形式で指定します。
ここで、'articles'
というキーを定義することで、ビューファイル側で$articles
という変数が使用できるようになります。
ビューファイル側で使う$articles
変数の中身の値は、このindex
アクションメソッドで定義したダミーデータ$articles
の値となります。
以上で、コントローラーの作成は完了です。
次はビューファイルを作成します。
本教材では、ビューに渡す変数を連想配列形式でview
メソッドの第二引数に渡しています。
Laravelでは、それ以外のコードの書き方でも変数をビューに渡すことができます。
ひとつめは、with
メソッドを使う方法です。
php1 Copied!return view('articles.index')->with(['articles' => $articles]);
view
メソッドにwith
メソッドを繋げて、with
メソッドの引数にビューファイルに渡す変数の名称と、その変数の値を連想配列形式を指定します。
もうひとつは、compact
関数を使う方法です。
php1 Copied!return view('articles.index', compact('articles'));
view
メソッドの第二引数に、compact
関数を使った結果を渡しています。
compact
関数を使うと、変数を連想配列形式で記述しなくて良いので、コードの量が減ってスッキリします。
これらのどれが正しいということはありませんが、本教材とは異なる書き方に遭遇しても戸惑わないよう、知識として覚えておいてもらえればと思います。