5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Laravel基本的な流れ④ ControllerとRoutingの基本を抑えよう。

Last updated at Posted at 2023-06-09

 Laravelで動きのメインを司るController、ページ遷移・動作の道筋を決めるRoutingについて書いていきます。

Step .1 Controllerを作る

まずはControllerという、処理をまとめて記載するファイルを作ります。ここでは例としてTweetControllerを作りましょう。

php artisan make:controller TweetController

すると、
app -> Http -> controllers に、TweetControllerが作成されます。

このContorollerの中に、関数として様々な処理を書き、その関数の名前を自分で付けていくことによりWebページを作成していきます。ただし、例えば「CRUD処理」などは非常によく使われるため、あらかじめある程度準備の済んだControllerが用意されています。このControllerを作りたい場合は

php artisan make:controller TweetController --resource

と、最後に--resourceをつけます。すると

index()  : データを一覧表示
create()  :  新規作成用のフォームを表示
store()  :  新規作成データを保存。フォームから送信されたデータを扱う。
show()   : 指定されたデータを個別に表示
edit()   :  作成データ編集用フォームを表示
update() :  編集したデータを更新する。フォームから送信されたデータを扱う。
destroy() : データを削除

の7つ関数がデフォルトで生成されているControllerが作成されます。

作成する段階で、そのController内で使いたいテーブルとそのModel(例えばTweet.php)が用意されている場合は

php artisan make:controller TweetController --resource --model=Tweet

とすれば、Model:「Tweet.php」がuse(紐づいた状態)された状態で作られます。
※もちろんModelとの紐付けは、作成後でもできます。

Step.2 ルーティングを行う

Laravelでは、ページ遷移・データ処理の道筋を「特定のアドレスへ」「特定のメソッドでアクセスする」ことによって実行します。

どのアドレスへ、どんなメソッド(GET/HEAD,POSTなど)でアクセスすると、どこを動かすのかを決めることをルーティングといいます。

一般的なルーティングは
routes -> web.php
にすべて記載します。

また、認証関係のルーティングは
routes -> auth.php
にまとめられています。

Step.2-1 ルーティングの書き方

①web.phpの先頭部分に、これから追加したいcontrollerをuseで紐づける。

web.php
<?php
use App\Http\Controllers\ProfileController;
use Illuminate\Support\Facades\Route;
// 🔽 追加
use App\Http\Controllers\TweetController;

②中段にルーティングを記載する。

 ※できる限りコメントを付けてまとめ、分かりやすくすると良い。

web.php
//Tweetを作成
Route::get('/tweet', 'App\Http\Controllers\TweetController@create')->name('tweet.create');
//Tweetを保存
Route::post('/tweet', 'App\Http\Controllers\TweetController@store')->name('tweet.store');

のように、
・メソッド(get/head,post)の指定
・アクセスするアドレス('/tweet'はアドレスの末尾)
・移動するcontroller(ルートからすべて記載)
・controller内のどの関数を動かすか(@createなど)
の順に記載します。最後の「->name('tweet.create')」は、これを付けると、この名前を指定するだけでその関数へ飛べるショートカットのようなものです。必要なら付けましょう。

--resourceでControllerを作った場合--

web.php
Route::resource('tweet', TweetController::class);

とかくだけで、必要なルーティングが自動的に作成されます。

具体的に書くと、以下の7つ書いたことと同じになります。使いこなすと便利ですね。

web.php
Route::get('/tweet', 'App\Http\Controllers\TweetController@index')->name('tweet.index');
Route::post('/tweet', 'App\Http\Controllers\TweetController@store)->name('tweet.store');
Route::get('/tweet/create', 'App\Http\Controllers\TweetController@create')->name('tweet.create');
Route::get('/tweet/{tweet}', 'App\Http\Controllers\TweetController@show')->name('tweet.show');
Route::patch('/tweet/{tweet}', 'App\Http\Controllers\TweetController@update')->name('tweet.update');
Route::delete('/tweet/{tweet}', 'App\Http\Controllers\TweetController@destroy')->name('tweet.destroy');
Route::get('/tweet/{tweet}/edit', 'App\Http\Controllers\TweetController@edit')->name('tweet.edit');

Step.2-2 ルートの確認

 制作を進めていくと、ルーティングもどんどん増えていきます。どこに、どうアクセスすれば何ができるのかを把握するのが難しくなってきますが、そういう時は適宜ルートの確認を行いながら進めます。
ターミナルで下のコマンドを叩きます。

php artisan route:list

すると

GET|HEAD        tweet .............................. tweet.index › TweetController@index
POST            tweet .................................................................................................. tweet.store › TweetController@store
GET|HEAD        tweet/create ......................................................................................... tweet.create › TweetController@create
GET|HEAD        tweet/{tweet} ............................................................................................ tweet.show › TweetController@show
PUT|PATCH       tweet/{tweet} ........................................................................................ tweet.update › TweetController@update
DELETE          tweet/{tweet} ...................................................................................... tweet.destroy › TweetController@destroy
GET|HEAD        tweet/{tweet}/edit ....................................................................................... tweet.edit › TweetController@edit

のように、現在設定されているルーティングが一覧で表示されます。
これは何度も使う重要コマンドです。

Step.3 Controller内の関数を実装する。

STEP.3-1 Controller内で使用するテーブルのModelをuseで紐づける。

例えば、tweetテーブルのModel、Tweetを紐付けたい場合は、Controllerの先頭部分に

app/Http/Controllers/TweetController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
// 🔽 追加
use App\Models\Tweet;

という感じで記載する。

STEP .3-2 各関数内に処理を書いていく

 ここの内容は様々です。参考までに以下にいくつかの例を挙げておきます。
こういった処理を組み合わせながらプロダクトを作っていきます。

①ページの表示(create.blade.php を表示する。)

※resource -> view -> message -> create.blade.php にcreate.blade.phpを置いているとき。
※下は$requestで送られてきたidを、$idとして送る方法。
 他に、複数のデータを連想配列として送るcompact関数などがよく使われます。

app/Http/Controllers/TweetController.php
$id = $request->input("id");
return view('message.create', ['id' => $id]);

②Usersテーブルから該当のデータ(例では、idが5のデータ)を取得して、$userへ格納する。

app/Http/Controllers/TweetController.php
$user = User::find(5);

※実際には

app/Http/Controllers/TweetController.php
$user = User::find($request -> send_to);

のように、$requestで送られてきたsend_toの値と同じidのデータを取ってくる、というように使うことが多い。

③データベースにデータを保存する。(storeに記載する。)

例として、Tweetテーブルに値を入れる処理を書いておく。カラムは
 id(自動作成)
 user_id
 tweet
 name
を持つテーブルであると仮定する。

app/Http/Controllers/TweetController.php

public function store(MessageRequest $request)
{        
    $tweet = new Tweet();

    $tweet->user_id = auth()->user()->id;
    $tweet->tweet = $request->tweet;
    $tweet->name = $request->name;
    
    $tweet->save();
}

$tweetという新しいインスタンスを作成して

$tweetのuser_idにはログインしているユーザーのユーザーidを取ってきて入れる
$tweetのtweetには$requestで送られてきたtweetを入れる
$tweetのnameには$requestで送られてきたnameを入れる

$tweetをデータベースに保存する

次の記事

5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?