Laravel6xのチュートリアルを試してわかった事まとめ

Laravel5Laravel


Warning: Undefined variable $content in /home/c9099599/public_html/dstrikes.net/wp-content/themes/cocoon-child-master/tmp/content.php on line 76
この記事は 約16 分で読めます。

先日ふと思い立ってLaravel6系の再入門をしようかとLaravel6xの現行バージョンでチュートリアルをした際の健忘録的まとめになります。

これからLaravelを始めてみようと言う方やフレームワークの主流であるMVCを学びたい方にはオススメの記事になります。

その他のLaravelに関する記事はこちら

Laravel5.5のログイン認証周りを弄ってみる その1
Laravel5.5の認証システムは用意されているまずはサクッとインストールからComposerでcomposercreate-projectlaravel/laravel--prefer-distプロジェクト名(フォルダ名)サクッとインス...
【Laravel5入門】インストールからDB設定までの使い方
とある開発系の友人からLaravel5使うようになりましたと言う声を聞いたのでちょっと触ってみたいなと興味が湧いたので触ってみた。初めてLaravel5を使った感想CakePHP3も満足に使えてない状態でLaravelを触ったので余計に意味...
Laravelでマッチングサイトのソースを公開したらTwitterで話題に
Laravelで作ったマッチングサイトの架空のサービスが一時的に公開されて約8000リツイート獲得しています。Laravelを勉強中の方には非常に参考にもなりますし、Githubでオープンソースとして公開されていますから、是非参考にして見て...
スポンサーリンク

準備と環境について

今回チャレンジしたチュートリアルはこちらです。

https://taroosg.io/laravel-crud-example

Laravel6xの基本的な使い方CRUDが学べます。
また非常に丁寧に解説してくれていますのでフレームワークが初めての方でも理解出来る内容かと思います。

筆者の開発環境

MacOS 10.14.6 Mojave
SSD 256GB
Memory 32GB

PHP:7.3.2
Laravel:6.13.1
Python: 3.7.3
node.js 6.13.7

以上の環境でスタートしますがチュートリアルはAWSのCloud9で行われていますのでインターネット環境さえあればチュートリアルを進めていけます。

手順詳細についてはチュートリアルの本記事にて解説されていますので、こちらの記事ではチュートリアルで覚えた事のまとめになります。

チュートリアルで学べる学習範囲

冒頭ではCRUDの一通りを学べるとざっくり説明しましたがもう少し詳しく説明します。

  1. Cloud9のアカウント解説方法
  2. environment(アプリケーション単位)の作り方
  3. Laravelのインストールおよび環境構築
  4. PHPモジュールのインストールとアップデート
  5. Laravel内の各フォルダ構成と内容
  6. Laravel/uiの使い方
  7. ログイン認証
  8. LaravelのCRUDの使い方
  9. artisanの使い方

以上のことが学べます。

私が試した2020年2月時点では手順通りに進めるもVerが違う為かエラーが出て先に進めませんでしたので、諦めてMacOSのローカル環境にてLaravelをインストールし手順に従いタスクアプリを制作しました。

こう言ったインフラ的な事に関しては疎いですし実際の開発現場では知らなくてもプログラミングは出来ますので、インフラのエラーPHPやNodeやMySQLに対して時間を費やしてしまうのは時間のロスだと感じたためです。

もちろん最近のモダン開発ではコマンドライン必須ですがPHPのバージョンやNodeの扱いぐらいは覚えておきたいですが、学習の妨げになっている事は間違いないのでエラーが出て先に進めない場合はローカル環境でLaravelをインストールしてチュートリアルを進めることをお勧めします。

モデルの制作とマイグレーション

モデルはMVCのうちの「M」の部分でありデータベースを意味しています。
マイグレーションファイルは /database/migrations に自動生成される。
モデルファイルは /app/テーブル名.php に自動生成される。

コマンド例

$ php artisan make:model モデル名

Taskモデルを定義する例

php artisan make:model Task -m

-mを付けると同時にマイグレーションファイルも生成してくれる
どちらにしてもモデルをMakeした後でMigrateするので-mはつけた方が便利。

Model created successfully.
Created Migration: 2019_10_21_000348_create_tasks_table

/app/Task.phpが作成される

続いてMigrateコマンドの書式

$ php artisan make:migration ファイル名 --create=テーブル名

/database/migrations に [yyyy]_[mm]_[dd]_[hms]_[ファイル名].php ファイルが生成される

/database/migrations/[yyyy]_[mm]_[dd]_[hms]_[ファイル名].php

<?php use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateTasksTable extends Migration
{
  public function up()
  {
    Schema::create('テーブル名', function (Blueprint $table) {
      $table->increments('id');
      //ここに必要なカラム名を追記する.
      $table->timestamps();
    });
  }

  public function down()
  {
    Schema::dropIfExists('テーブル名');
  }
}

上記のマイグレーションファイルの役割はテーブルのカラムの定義がメインです。
カラム名の追記は

$table->カラム型('カラム名');
$table->increments('id');       //自動採番(主キー)
$table->string('email');        //varcharカラム
$table->string('name', 100);    //長さ指定カラム
$table->integer('price');       //integerカラム
$table->text('description');    //textカラム
$table->dateTime('created_at'); //datetimeカラム
$table->timestamps();           //created_atとupdated_atカラムを追加
$table->boolean('confirmed');   //true, falseカラム
$table->json('meta');           //jsonカラム

必要な各カラムを追記してテーブルを構成します。
カラムオプション設定の例

$table->string('email')->nullable();    //nullを許可
$table->string('email')->unique();      //ユニークな値

MySQLのバージョンが5.7.7より古い場合は実行時にエラーが出るので/app/Providers/AppServiceProvider.phpに1行追記する。

use Illuminate\Support\Facades\Schema;
public function boot()
  {
    // 下記を追記
    Schema::defaultStringLength(191);
  }

マイグレーション実行コマンド(テーブル制作)

$ php artisan migrate

基本はこれでマイグレーションに設定した通りにテーブルにカラムが作られるが後からカラムを追加した場合やエラーが出てやり直したい場合は以下の通りにする。

全てのテーブル作り直し ※テーブル内のデータは全て消える
$ php artisan migrate:fresh

直前に実行した内容を取り消す
$ php artisan migrate:rollback

全てロールバックしてからマイグレーションを再度実行する
$ php artisan migrate:refresh

各テーブルの状況を見る
$ php artisan migrate:status

アプリケーション試作段階では全てfreshで良いかと思うが、運用途中で失敗した場合はロールバックを多用するイメージ。

ルーティングとコントローラー

コントローラーはMVCの「C」を意味します。
コントローラーファイルは /app/http/controllers/に生成される。

ルーティング

こちらの記事がわかりやすいです。
参考: LaravelのRoute、全8パターン実例

ルーティングはどのURLにリクエストが来た時にどの関数を実行するかを定義するもの。

ルーティング定義ファイルは /app/web.php を編集します。

Route::get('/user/profile', 'UserController@index')->name('profile');

http://yourdomain.com/user/profile にアクセスがあった場合。
UserControllerが呼び出されてindex()に記載されたルールに則った処理が行われる。

->name('profile') を付けるとリクエストURLにな名前を設定出来る。
リクエスト送信先を以下のように出来る。

$url = route('profile');

基本的にはartisanコマンド実行時に自動で追記されるので必要な場合を除いて弄らない。

その他Laravel6で使用出来るルーティングメソッド

Route::get($uri, $callback);
Route::post($uri, $callback);
Route::put($uri, $callback);
Route::patch($uri, $callback);
Route::delete($uri, $callback);
Route::options($uri, $callback);

Route::match(['get', 'post'], '/', function (){
    //
});
Route::any('/', function () {
    //
});

リダイレクト
Route::redirect('/here', '/there');

301リダイレクト
Route::redirect('/here', '/there', 301);
Route::permanentRedirect('/here', '/there');

ビュールート
Route::view('/welcome', 'welcome');
Route::view('/welcome', 'welcome', ['name' => 'Taylor']);
第2引数でViewを定義し第3引数でビューに渡すデータを指定出来ます。

参考:https://readouble.com/laravel/6.x/ja/routing.html

コントローラー

コントローラーはルーティングから渡されたデータを元にモデル(database)やviewを選択して指示を出す司令塔のような役割を果たします。/app/Http/Controllers/ に配置されます。

php artisan make:controller TasksController --resource

–resourceオプションを付けると通常使うであろうルーティングが同時に作成される。(推奨)

上記コマンドを実行したら以下のコードを/app/routes/web.phpに追加する

Route::resource('tasks', 'TasksController');

この1行だけで以下のルーティング全てに対応します。

+------------+---------------------+----------+----------------+---------------------------+
| method     | uri                 | action   | route name     | explanation               |
+------------+---------------------+----------+----------------+---------------------------+
| GET        | /tasks              | index    | tasks.index    | データの一覧を取得する処理    |
| GET        | /tasks/create       | create   | tasks.create   | データ追加画面へ移動する処理   |
| POST       | /tasks              | store    | tasks.store    | dbへデータを追加する処理      |
| GET        | /tasks/{task}       | show     | tasks.show     | データを1件取得する処理       |
| GET        | /tasks/{task}/edit  | edit     | tasks.edit     | データ更新画面へ移動する処理   |
| PUT/PATCH  | /tasks/{task}       | update   | tasks.update   | dbのデータを更新する処理      |
| DELETE     | /tasks/{task}       | destroy  | tasks.destroy  | dbのデータを削除する処理      |
+------------+---------------------+----------+----------------+---------------------------+

以下のコマンドで確認出来ます。

$ php artisan route:list 現在のルーティングを表示するコマンド

/app/routes/web.php で必要なルーティングだけを明記する

Route::resource('tasks', 'TasksController')->only([
    'index', 'store', 'edit', 'update', 'destroy'
]);

->only を記述しない場合、不要な処理まで全て実行されるが処理が存在しないためにエラーになる。

それぞれの役割は以下の通りである。

  • タスクを一覧表示する処理 → index
  • タスクを追加する処理 → store
  • タスクの編集画面へ移動する処理 → edit
  • タスクの内容を更新する処理 → update
  • 完了したタスクを削除する処理 → destroy

1つのテーブルのCRUDを作る一連の流れ

1つのテーブル(モデル)を作ってルーティングからコントローラーまで設定する流れ

  1. php artisan make:model テーブル名 -m
  2. /database/migrations でカラムを定義
  3. /app/Providers/AppServiceProvider.phpのboot()にSchema::defaultStringLength(191);追加
  4. php artisan migrate実行(テーブルが生成される)
  5. /routes/web.phpにルーティング追加
    Route::resource(‘tasks’, ‘TasksController’)->only([
    ‘index’, ‘store’, ‘edit’, ‘update’, ‘destroy’
    ]);
  6. /app/Http/Controllers/モデル名Controller.phpにバリデーションとモデル追加
    use Validator;
    use App/モデル名; Task等
  7. /resources/views/ モデル名.blade.php でビューファイルを新規作成
  8. /resources/views/layouts/app.blade.phpのscriptとlinkタグの読み込みをsecure_asset()に編集する
  9. /resources/viewscommonディレクトリを作成してerror.blade.phpでエラー画面を作る
  10. /app/Http/Controllers/モデルController.phpのindex()に追記 return view(‘モデル名’);
  11. /app/Http/Controllers/モデルContoller.phpのstore()にバリデーションとEloquentを追加 ※1
  12. モデルcontroller.phpのindex()にモデルの表示を入れる ※2
  13. resources/views/モデル.blade.php に表示と削除ボタンを書く
  14. モデルController.phpのdestroy()に削除処理を書く ※3
※1

public function store(Request $request)
{
  // バリデーション
  $validator = Validator::make($request->all(), [
    'task' => 'required|max:255',
  ]);
  // バリデーション:エラー
  if ($validator->fails()) {
    return redirect()
      ->route('tasks.index')
      ->withInput()
      ->withErrors($validator);
  }
  // Eloquentモデル
  $task = new Task;
  $task->task = $request->task;
  $task->deadline = '2019-10-21';
  $task->comment = 'todo!';
  $task->save();
  // ルーティング「tasks.index」にリクエスト送信(一覧ページに移動)
  return redirect()->route('tasks.index');
}
※2
public function index()
{
  // return view('tasks');
  // 下記のように編集
  $tasks = Task::orderBy('deadline', 'asc')->get();
  return view('tasks', [
    'tasks' => $tasks
  ]);
}
※3
public function destroy($id)
{
  $task = Task::find($id);
  $task->delete();
  return redirect()->route('tasks.index');
}

データ更新部分は省きましたがテーブル1つに対しての処理は以上の通りです。

総合的な手順を覚えるには時間が掛かりそうだが「何をする必要があるのか?」が理解出来てくれば自然と覚えてしまいそうな印象を受けました。

数をこなして手を動かして反復学習していくうちに覚えるでしょう。
その為に1つのチュートリアルを10回は繰り返さないとダメかなと思った。

コメント