Open TM4423 opened 2 years ago
間違えやすいところ 2ヶ所
①booksテーブルを作成 (テーブル設計図-マイグレーションの作成と実行)
④ルート定義(ルーティング)を作成
本章ではAWSのCloud9上で各種インストール、Laravelプロジェクトを作成、DBの作成と接続、そのほかのLaravelプロジェクトの初期設定を行います この章は「手を動かして体で覚える」ことがまず何より重要です。習うより慣れろ!
全てCloud9のターミナル上で操作をします ターミナル上で該当のコードをコピペしてEnterキーを押しましょう
↓これがターミナル
sudo yum update -y
sudo yum -y remove php-*
sudo yum update -y amazon-linux-extras
amazon-linux-extras
sudo amazon-linux-extras disable lamp-mariadb10.2-php7.2
sudo amazon-linux-extras enable php8.0
sudo yum clean metadata && sudo yum install php-{pear,cgi,pdo,common,curl,mbstring,gd,mysqlnd,gettext,bcmath,json,xml,fpm,intl,zip,cli,devel}
sudo pecl uninstall xdebug & sudo pecl install xdebug
sudo systemctl restart httpd.service
sudo systemctl restart php-fpm.service
sudo yum list installed | grep mariadb
sudo amazon-linux-extras install mariadb10.5 -y
sudo systemctl start mariadb
sudo mysql_secure_installation
※ 入力項目
Enter current password for root (enter for none): [Enterキー]
Switch to unix_socket authentication [Y/n] y または Enterキー
Set root password? [Y/n] y または Enterキー
New password: root ※パスワードは入力しても画面に表示されません
Re-enter new password: root
Remove anonymous users? [Y/n] y または Enterキー
Disallow root login remotely? [Y/n] y または Enterキー
Remove test database and access to it? [Y/n] y または Enterキー
Reload privilege tables now? [Y/n] y または Enterキー
メモ:[Y/n]のYはなぜ大文字?
大文字の選択肢がデフォルトで、Enterを押下すると選択されるオプション
メモ:Maria DBインストール参考URL
sudo systemctl enable mariadb
sudo systemctl is-enabled mariadb
curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/bin/composer
composer
※ composerが最新版でない場合は下記を実行(今回は不要)
sudo composer update
2022/2/8にリリースされたばかりの最新版を使います
composer create-project laravel/laravel cms
cmsフォルダが作成されいればOK
cd cms
php artisan serve --port=8080
Starting Laravel development server: http://127.0.0.1:8080
[日時] PHP 8.0.13 Development Server (http://127.0.0.1:8080) started
🔥ここでエラーが出た場合
下記を実行する
sudo yum install php-cli php-common php-devel php-fpm php-gd php-mysqlnd php-mbstring php-pdo php-xml
y → Enterキー
sudo composer update
php artisan key:generate
動作確認② - プレビュー
画面上部メニューの preview
> Preview Running Application
こういう画面が出ればOK 右上の「別タブで開く」アイコンをクリックすると便利
メモ:cms
が今回作るプロジェクトのディレクトリ名
メモ:授業で使うPHPとLaravelのバージョン
cd cms/public
wget https://files.phpmyadmin.net/phpMyAdmin/5.1.2/phpMyAdmin-5.1.2-all-languages.zip
unzip phpMyAdmin-5.1.2-all-languages.zip
cms/public内にphpMyAdmin-5.1.2-all-languagesのフォルダが解凍されているか確認しましょう
cd ..
-> phpMyAdmin に変更する
プレビュー画面を立ち上げ、URLの最後に /phpMyAdmin/index.php を追加しEnter
いつもの見慣れた画面が表示されていれば成功!!
ユーザー名・パスワードは「DBの準備」で入力した 「root」
データベースを作成 方法はいくつかありますが、今回はターミナルで作成にチャレンジしてみましょう! でも基本はわかりやすいphpMyAdmin上での作成がおすすめです
データベースの作成
ターミナルでDB作成する場合
mysql -u root -p
root [Enterキー]
create database c9;
show databases;
exit;
phpMyAdminで作成する場合
PHPの授業でやったのと同じです^^
phpMyAdminの管理画面で c9 というDBを作成
※照合順はutf8mb4_general_ciを選択
隠しファイルを表示
.envファイルを編集 cms直下にあるenvファイル内の同じ箇所を上書き(11行目あたり)
DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=3306
DB_DATABASE=c9
DB_USERNAME=root
DB_PASSWORD=root
※メモ:env
environment(環境)の略
Webサーバーを再起動
Ctrl + C
php artisan serve --port=8080
/app/Providers/AppServiceProvider.php ファイルを修正
// 冒頭6行目あたり
use Illuminate\Support\Facades\URL; //この行を追加
// boot(){}内に追加
public function boot() {
URL::forceScheme('https'); //この行を追加
}
この章ではログイン認証を実装して、Laravelの凄さを体験してみましょう!
php artisan migrate
composer require laravel/ui
※Laravel UIは認証周りの機能の雛型を生成してくれるLaravel公式のライブラリ
php artisan ui vue --auth
npm install
npm run dev
こうなっていればOK 登録やログインができるか試してみましょう
これがターミナル↓
# **L**i**S**t ディレクトリ一覧を表示
ls
# **C**hange **D**irectory ディレクトリを変更
cd + ディレクトリ名
# 一つ戻る場合は
cd ..
# 候補を見たいときは
cd + Tabキー
# ターミナルの画面をリセット
clear
# 実行中のコマンドを強制終了(例:Laravelのサーバーを停止)
Ctrl + C
# コマンドの履歴を選択
カーソルキー 「↑」 or 「↓」
# **P**rint **W**orking **D**irectory 現ディレクトリを表示
pwd
ArtisanはLaravelが標準で搭載しているコマンドラインインターフェース(CLI)です。 (CLIとはキーボードで操作する画面のこと。ターミナルで php artisan ~~~ と入力したあれです)
artisanコマンドを使用すると、Model作成、Controller作成、マイグレーションファイル作成&実行(そのほか色々!)などの、Laravelでよく使う機能を簡単に実行することができます
全てのartisanコマンドを表示
php artisan list
マイグレーションファイル(テーブル)作成
php artisan make:migration create_{テーブル名(複数形の名詞)}_table --create_{テーブル名(複数形)}
// 例
php artisan make:migration create_books_table --create=books
マイグレーション実行
php artisan migrate
モデル作成
php artisan make:model {Xxx(単数系・先頭は大文字)}
// 例
php artisan make:model Book
コントローラ作成
php artisan make:controller {Xxx}Controller
// 例
php artisan make:controller BooksController --resource
// ※ --resourceオプションは後ほど学びます。今は「全部入り」のコントローラ(監督)を召喚すると思ってください
この章では、Webフレームワークの設計モデル(アーキテクチャ)の一つであるMVCモデルを学びましょう Model, View, Controllerそれぞれの役割を理解することで、Laravelでのアプリ開発がよりスムーズになります
例として,DB から取り出したデータを一覧画面に表示する流れを考えてみる
リクエストからの処理の流れ リクエスト -> Route -> Controller の順で処理が実行される
DB から取り出したデータの流れ Model -> Controller -> View の順で処理が実行される
©︎taroosg
この章ではいよいよ本格的にブックマークアプリのCRUD処理を開発します どういう役割のコードを書いているのか、感覚をつかみながら開発しましょう
(迷ったら参照しましょう)**
ここでは、本を登録するためのBDテーブルを作成します LaravelではMigrationというテーブル作成に便利な機能が備わっています
php artisan make:migration create_books_table --create=books
※成功すると、database/migrationsの直下にYYYY_MM_DD_xxxxxx_create_books_table.phpが作成されます
public function up()
{
Schema::create('books', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('item_name');
$table->integer('item_number');
$table->integer('item_amount');
$table->date('published');
$table->timestamps();
});
}
ターミナル上でコマンド実行
php artisan migrate
実行したら、phpMyAdminでbooksテーブルとカラムが作成されているか確認しましょう
山崎学校長のLaravelDB.comで簡単にMigrationファイルが作れる! サイト:https://laraveldb.com/index.php デモ動画:https://www.youtube.com/watch?v=sHt5v4XOWbc
基本的に使うのはstring integer などの決まったものです。 必要に応じてカラムを作成しましょう 参考ページ(公式<日本語>)
Modelはデータベースをうまく処理してくれる役割を担います。 ①で作ったbooksテーブルに対応するBookモデルをここでは作成しましょう。
img
©︎山崎学校長
php artisan make:model Book
Eloquent Model は Laravel 標準の ORM(object-relational mapper)である.ORM とは,DB のレコードをオブジェクトとして直感的に扱えるようにしたもので,SQL を意識せずにプログラムで処理を記述することができる.
Eloquent Model は定義された「Model」を用いることで簡単に DB へのデータ保存・取得などを行える.
1 つのモデルが 1 つのテーブルに対応する.
例えば,booksテーブルに対してBookのようにモデルを定義すると自動的に対応する.モデル内に明示的に対応を記述することもできる.
テーブルに対してデータ操作を行う場合,対応するモデルに対して処理を実行することで DB 操作を行うことができる.
引用元:taroosg先生
①のMigrationファイルと②のModelを同時に作成する-m のオプションを末尾につける
php artisan make:model Book -m
他にもControllerを同時に作れたりと、色々なオプションが用意されているので、慣れてきたら利用しましょう 参考:https://qiita.com/niisan-tokyo/items/9c799989cb535489f201
この項では実際に表示画面を作成していきましょう 扱うファイルは app.blade.php & books.blade.php です
img
app.blade.phpを未作成の場合、以下コードを貼り付けます。
<!DOCTYPE html>
<html lang="ja">
<head>
<title>Book List</title>
<!-- CSS と JavaScript -->
</head>
<body>
<div class="container">
<nav class="navbar navbar-default">
<!-- ナビバーの内容 -->
</nav>
</div>
@yield('content')
</body>
</html>
img
@extends('layouts.app')
@section('content')
<!-- Bootstrapの定形コード… -->
<div class="card-body">
<div class="card-title">
ブックマーク
</div>
<!-- ↓バリデーションエラーの表示に使用-->
<!-- ↑バリデーションエラーの表示に使用-->
<!-- 本登録フォーム -->
<form action="{{ url('books') }}" method="POST" class="form-horizontal">
@csrf
<!-- 本のタイトル -->
<div class="form-group col-md-6 p-2">
<label for="item_name" class="col-sm-3 control-label">タイトル</label>
<input type="text" name="item_name" class="form-control" id="item_name">
</div>
<!-- 冊数 -->
<div class="form-group col-md-6 p-2">
<label for="item_number" class="col-sm-3 control-label">冊数</label>
<input type="text" name="item_number" class="form-control" id="item_number">
</div>
<!-- 金額 -->
<div class="form-group col-md-6 p-2">
<label for="item_amount" class="col-sm-3 control-label">金額</label>
<input type="text" name="item_amount" class="form-control" id="item_amount">
</div>
<!-- 公開日 -->
<div class="form-group col-md-6 p-2">
<label for="published" class="col-sm-3 control-label">公開日</label>
<input type="date" name="published" class="form-control" id="published">
</div>
<!-- 本 登録ボタン -->
<div class="form-group p-2">
<div class="col-sm-offset-3 col-sm-6">
<button type="submit" class="btn btn-primary">
Save
</button>
</div>
</div>
</form>
</div>
<!-- Book: 既に登録されてる本のリスト -->
@endsection
💡 【コード解説 / @yieldと@sectionの部分は何している?】
親のapp.blade.php
@yield('content')
のところに、子のbooks.blade.php
@secion('content')
から
@endsection
までの部分を挿入している
Viewは画面に表示する役割でした。
Laravelではresources/views/
のディレクトリ下に
{ファイル名}.blade.php
として保存します
これまでにDB+Model(データの操作を担当)、View(表示を担当)を作成しました ここでは、Webアプリの玄関口(受付)となるRoutingを作成していきましょう
img
先頭部
use App\Models\Book;
use Illuminate\Http\Request;
中間
// 本のダッシュボード表示(books.blade.php)
Route::get('/', function () {
return view('books'); //** ここを修正 **
});
// ** ここから追加 **
// 新「本」を追加
Route::post('/books', function (Request $request) {
//
});
// 「本」の更新画面表示
Route::get('/booksedit/{book}',function(Book $book){
//
});
// 「本」の更新処理
Route::post('books/update',function(Request $request){
//
});
// 本を削除
Route::delete('/book/{book}', function (Book $book) {
//
});
プレビュー画面で/
にアクセス(URLは https://(中略).amazonaws.com/
)。
無事に本のタイトルを入力するフォームが表示されていればOK
// 新「本」を追加
Route::post('/books', function (Request $request) {
$book = new Book;
$book->item_name = $request->item_name;
$book->item_number = $request->item_number;
$book->item_amount = $request->item_amount;
$book->published = $request->published;
$book->save();
return redirect('/');
});
本項では、登録したデータの一覧を取得し表示する機能を実装していきましょう
Route::get('/', function () {}
の中身を編集しましょう
Route::get('/', function () {
$books = Book::orderBy('created_at', 'asc')->get();
return view('books', ['books' => $books]);
//return view('books',compact('books')); //も同じ意味
});
< !-- Book: 既に登録されてる本のリスト -->の下に追加
<!-- Book: 既に登録されてる本のリスト -->
@if (count($books) > 0)
<div class="card-body">
<table class="table table-striped task-table">
<!-- テーブルヘッダ -->
<thead>
<th>本一覧</th>
<th> </th>
</thead>
<!-- テーブル本体 -->
<tbody>
@foreach ($books as $book)
<tr>
<!-- 本タイトル -->
<td class="table-text">
<div>{{ $book->item_name }}</div>
</td>
<!-- 本: 削除ボタン -->
<td>
</td>
<!-- 本: 更新ボタン -->
<td>
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
@endif
Bladeテンプレートエンジンに備わっている便利な繰り返し処理をしてくれる機能
PHPの foreach
と同じ感じで書ける
viewで$books
に値が入っているか確かめたい時は
{{dd($books)}}
を仕込んでみよう
※Controllerで dd($books);
をするのもGOOD
< !-- 本: 削除ボタン -->下の
<form action="{{ url('book/'.$book->id) }}" method="POST">
@csrf
@method('delete')
<button type="submit" class="btn btn-danger">
削除
</button>
</form>
プレビュー
Route::delete('/book/{book}', function (Book $book) {
$book->delete(); //追加
return redirect('/'); //追加
});
更新処理では、2つのRouteが必要になります i. 更新をするための画面を表示する用のRoute ii. 実際にbooksテーブルを更新する用のRoute
削除ボタンの
<!-- 本: 更新ボタン -->
<td>
<a href="{{ url('booksedit/'.$book->id) }}">
<button type="submit" class="btn btn-primary">更新</button>
</a>
</td>
プレビュー
@extends('layouts.app')
@section('content')
<div class="row container">
<div class="col-md-12">
<!-- ↓バリデーションエラーの表示に使用-->
<!-- ↑バリデーションエラーの表示に使用-->
<form action="{{ url('books/update') }}" method="POST">
<!-- item_name -->
<div class="form-group p-2">
<label for="item_name">タイトル</label>
<input type="text" name="item_name" class="form-control" id="item_name" value="{{$book->item_name}}">
</div>
<!--/ item_name -->
<!-- item_number -->
<div class="form-group p-2">
<label for="item_number">冊数</label>
<input type="text" name="item_number" class="form-control" id="item_number" value="{{$book->item_number}}">
</div>
<!--/ item_number -->
<!-- item_amount -->
<div class="form-group p-2">
<label for="item_amount">金額</label>
<input type="text" name="item_amount" class="form-control" id="item_amount" value="{{$book->item_amount}}">
</div>
<!--/ item_amount -->
<!-- published -->
<div class="form-group p-2">
<label for="published">公開日</label>
<input type="date" name="published" class="form-control" id="published" value="{{$book->published}}">
</div>
<!--/ published -->
<!-- Save ボタン/Back ボタン -->
<div class="form-group p-2">
<div class="well well-sm">
<button type="submit" class="btn btn-primary">Save</button>
<a class="btn btn-link pull-right" href="{{ url('/') }}"> Back</a>
</div>
</div>
<!--/ Save ボタン/Back ボタン -->
<!-- id 値を送信 -->
<input type="hidden" name="id" value="{{$book->id}}" />
<!--/ id 値を送信 -->
<!-- CSRF -->
@csrf
<!--/ CSRF -->
</form>
</div>
</div>
@endsection
// 「本」の更新画面表示
Route::get('/booksedit/{book}',function(Book $book){
return view('booksedit', ['book' => $book]);
});
// 「本」の更新処理
Route::post('books/update',function(Request $request){
// Eloquent モデル
$books = Book::find($request->id);
$books->item_name = $request->item_name;
$books->item_number = $request->item_number;
$books->item_amount = $request->item_amount;
$books->published = $request->published;
$books->save();
return redirect('/');
});
実際に「タイトル」など変更できるか確認してみましょう!
プレビュー(更新画面)
プレビュー(一覧画面<タイトル更新後>) ※ここでは「テスト本(更新しました)」というタイトルに変更しています↓
今まではルート定義(web.php)に、とあるURLが呼ばれた時の処理を書いていましたね。※例:↓function(){}
の部分
Route::get('/', function () {
$books = Book::orderBy('created_at', 'asc')->get();
return view('books', ['books' => $books]);
});
あれ、コントローラ(司令官)がなくてもアプリ作れちゃった・・・。コントローラいらなくね?
ちょっと待ってください!確かに機能が限られているサービスなら、ルート定義にfunction()部分を直接書いても一つのファイルで完結するのでわかりやすい面も。
でも、一般的なサービスでは数十~数百のルート定義があるのはあたりまえ。そうなるとルート定義が肥大化して逆にわかりにくいコードになってしまいます。
この章ではルート定義に持たせていた処理の役割をコントローラに移行しましょう。
左が・・・右になります!どちらが見通しがいいですか?
ControllerもMigrationやModelと同じでartisanコマンド一発で作成できます!!
php artisan make:controller BooksController --resource
BooksControllerが作成されたか確認
BooksController.php
// 6行目に追加
use App\Models\Book; //Book モデルを使えるようにする
まずは表示処理の部分をやってみましょう
web.php
// 本のダッシュボード表示(books.blade.php)
Route::get('/', function () {
// ↓ここから
$books = Book::orderBy('created_at', 'asc')->get();
return view('books', ['books' => $books]);
// ↑ここまでをBooksControllerの index()に移行
});
BooksController.php
public function index()
{
// ↓ここから
$books = Book::orderBy('created_at', 'asc')->get();
return view('books', ['books' => $books]);
// ↑ここまでを貼り付け
}
web.php
// 6行目
use App\Http\Controllers\BooksController; //追加
web.phpの表示処理のルート /
に、BooksControllerの表示処理のfunction( index
)を紐付けましょう
Route::get('/', [BooksController::class, 'index']);
ルート定義と対応するリソースコントローラのfunction名
web.php(該当部分)
// 本のダッシュボード表示(books.blade.php)
Route::get('/', [BooksController::class, 'index']);
// 新「本」を追加
Route::post('/books', [BooksController::class, 'store']);
//「本」の更新画面表示
Route::get('/booksedit/{book}',[BooksController::class, 'edit']);
//「本」の更新処理
Route::post('books/update',[BooksController::class, 'update']);
// 本を削除
Route::delete('/book/{book}', [BooksController::class, 'destroy']);
BooksController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\Book;
class BooksController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
$books = Book::orderBy('created_at', 'asc')->get();
return view('books', ['books' => $books]);
//return view('books',compact('books')); //も同じ意味
}
/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response
*/
public function create()
{
//
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
$book = new Book;
$book->item_name = $request->item_name;
$book->item_number = $request->item_number;
$book->item_amount = $request->item_amount;
$book->published = $request->published;
$book->save();
return redirect('/');
}
/**
* Display the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
{
//
}
/**
* Show the form for editing the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function edit(Book $book)
{
return view('booksedit', ['book' => $book]);
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(Request $request)
{
// Eloquent モデル
$books = Book::find($request->id);
$books->item_name = $request->item_name;
$books->item_number = $request->item_number;
$books->item_amount = $request->item_amount;
$books->published = $request->published;
$books->save();
return redirect('/');
}
/**
* Remove the specified resource from storage.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroy(Book $book)
{
$book->delete(); //追加
return redirect('/'); //追加
}
}
バリデーションとは入力チェック(検証)のことで、ルール通り正しい形式で書かれているか確認することです。この章では今まで作った画面に、バリデーションを追加しましょう。
(登録&更新画面 books.blade.php
booksedit.blade.php
)
今回はValidatorファサード
というLaravelに備わっている機能を使用し、バリデーションを実装していきます
💡 この部分を作ります
<BooksController.php 7行目>
<?php
namespace App\\Http\\Controllers;
use Illuminate\\Http\\Request;
use App\Models\Book;
use Validator; // 追加
public function store (Request $request)
{
// バリデーション(ここを追加)
$validator = Validator::make($request->all(), [
'item_name' => 'required | min:3 | max:255',
'item_number' => 'required | min:1 | max:3',
'item_amount' => 'required | max:6',
'published' => 'required',
]);
// Eloquentモデル(登録処理)
// ...
}
public function store (Request $request)
{
// バリデーション
$validator = Validator::make($request->all(), [
// 省略
]);
// バリデーション:エラー (ここを追加)
if ($validator->fails()) {
return redirect('/')
->withInput()
->withErrors($validator);
}
// Eloquentモデル(登録処理)
// ...
}
/resources/views/common/errors.blade.php を作成します
/resources/views/
の配下にcommon
というフォルダを作り、そこにerrors.blade.php
を作成
下記を貼り付け resources/views/common/errors.blade.php
@if (count($errors) > 0)
<!-- Form Error List -->
<div class="alert alert-danger">
<div><strong>入力した文字を修正してください。</strong></div>
<div>
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
</div>
@endif
books.blade.php の該当部分(9行目あたり)
<!-- バリデーションエラーの表示に使用-->
@include('common.errors')
<!-- バリデーションエラーの表示に使用-->
ここまでできたら、エラーが表示されるか確認してみましょう
入力した値がバリデーションに引っかかりました→今まで入力した値が全消しになっているとイラッとしませんか?
そんな時のために、inputに下記の oldヘルパー
を記述すると、前に入力した値が保持されます!!
value="{{ old(変数名) }}"
例)本のタイトルのinputタグ
value="{{old('item_name')}}"
ここが該当部分
<!-- 本のタイトル -->
<div class="form-group col-md-6">
<label for="item_name" class="col-sm-3 control-label">タイトル</label>
<input type="text" name="item_name" class="form-control" id="item_name" value="{{old('item_name')}}">
</div>
新規登録のバリデーションとエラー表示の機能は実装できました。 もう一つ、更新処理を同様に仕上げましょう。
今日の目標
環境構築
本章ではAWSのCloud9上で各種インストール、Laravelプロジェクトを作成、DBの作成と接続、そのほかのLaravelプロジェクトの初期設定を行います この章は「手を動かして体で覚える」ことがまず何より重要です。習うより慣れろ!
PHPのセットアップ
全てCloud9のターミナル上で操作をします ターミナル上で該当のコードをコピペしてEnterキーを押しましょう
↓これがターミナル
DBの準備(MariaDB)
※ 入力項目
メモ:[Y/n]のYはなぜ大文字?
大文字の選択肢がデフォルトで、Enterを押下すると選択されるオプション
メモ:Maria DBインストール参考URL
https://knowledge.rinpress.com/index.php/MariaDBのインストール
composerのインストール
※ composerが最新版でない場合は下記を実行(今回は不要)
Laravelプロジェクトの作成
2022/2/8にリリースされたばかりの最新版を使います
cmsフォルダが作成されいればOK
🔥ここでエラーが出た場合
下記を実行する
y → Enterキー
動作確認② - プレビュー 画面上部メニューの
preview
>Preview Running Application
こういう画面が出ればOK 右上の「別タブで開く」アイコンをクリックすると便利
メモ:
cms
が今回作るプロジェクトのディレクトリ名メモ:授業で使うPHPとLaravelのバージョン
phpMyAdminのインストール
DBの作成&Laravelと接続
データベースを作成 方法はいくつかありますが、今回はターミナルで作成にチャレンジしてみましょう! でも基本はわかりやすいphpMyAdmin上での作成がおすすめです
データベースの作成
ターミナルでDB作成する場合
phpMyAdminで作成する場合
PHPの授業でやったのと同じです^^
隠しファイルを表示
.envファイルを編集 cms直下にあるenvファイル内の同じ箇所を上書き(11行目あたり)
※メモ:
env
environment(環境)の略
Webサーバーを再起動
Ctrl + C
php artisan serve --port=8080
Laravelの初期設定(HTTPS設定)
/app/Providers/AppServiceProvider.php ファイルを修正
ターミナル操作(参照用)
これがターミナル↓
ログイン認証
この章ではログイン認証を実装して、Laravelの凄さを体験してみましょう!
1. マイグレーションを実行
2. laravel/ui パッケージをインストール
※Laravel UIは認証周りの機能の雛型を生成してくれるLaravel公式のライブラリ
3. artisan コマンドを実行
4. npmパッケージをインストール
5. パッケージをビルド(これを×2回叩く)
6. 確認
[]()
MVCモデル
この章では、Webフレームワークの設計モデル(アーキテクチャ)の一つであるMVCモデルを学びましょう Model, View, Controllerそれぞれの役割を理解することで、Laravelでのアプリ開発がよりスムーズになります
MVC + Routing
例として,DB から取り出したデータを一覧画面に表示する流れを考えてみる
リクエストからの処理の流れ リクエスト -> Route -> Controller の順で処理が実行される
DB から取り出したデータの流れ Model -> Controller -> View の順で処理が実行される
©︎taroosg
CRUD実装(ブックマークアプリ)
この章ではいよいよ本格的にブックマークアプリのCRUD処理を開発します どういう役割のコードを書いているのか、感覚をつかみながら開発しましょう
①booksテーブルを作成 (テーブル設計図-マイグレーションの作成と実行)
ここでは、本を登録するためのBDテーブルを作成します LaravelではMigrationというテーブル作成に便利な機能が備わっています
💡解説 / マイグレーション
マイグレーションとは「マイグレーションファイル」を用いてテーブルを管理する仕組み 「マイグレーションファイル」にテーブル名やカラム名を記述し,指定されたコマンドを実行することで設定したテーブルが生成される
1. booksテーブルの設計書(マイグレーションファイル)を作成
※成功すると、database/migrationsの直下にbooks_table.phpが作成されます
2. database/migrationsの直下のbooks_table.phpに以下追記
3. マイグレーション(テーブル作成)を実行
ターミナル上でコマンド実行
4. booksテーブルが作成されているか確認
実行したら、phpMyAdminでbooksテーブルとカラムが作成されているか確認しましょう
便利ツール(LaravelDB.com)
山崎学校長のLaravelDB.comで簡単にMigrationファイルが作れる! https://laraveldb.com/index.php
②Modelを作成(テーブルを簡単に扱えるようにする機能)
Modelはデータベースをうまく処理してくれる役割を担います。 ①で作ったbooksテーブルに対応するBookモデルをここでは作成しましょう。
img
©︎山崎学校長
1. ターミナルでコマンドを実行しModelを作成
2. /app/Models/Book.php(Model) に作成されたことを確認
💡解説 / Eloquent Model
Eloquent Model は Laravel 標準の ORM(object-relational mapper)である.ORM とは,DB のレコードをオブジェクトとして直感的に扱えるようにしたもので,SQL を意識せずにプログラムで処理を記述することができる.
Eloquent Model は定義された「Model」を用いることで簡単に DB へのデータ保存・取得などを行える.
1 つのモデルが 1 つのテーブルに対応する.
例えば,booksテーブルに対してBookのようにモデルを定義すると自動的に対応する.モデル内に明示的に対応を記述することもできる.
テーブルに対してデータ操作を行う場合,対応するモデルに対して処理を実行することで DB 操作を行うことができる.
引用元:taroosg先生
💡+α / MigrationとModelは同時に作成できる
①のMigrationファイルと②のModelを同時に作成する-m のオプションを末尾につける
他にもControllerを同時に作れたりと、色々なオプションが用意されているので、慣れてきたら利用しましょう 参考:https://qiita.com/niisan-tokyo/items/9c799989cb535489f201
③Viewを作成(表示画面)
この項では実際に表示画面を作成していきましょう 扱うファイルは app.blade.php & books.blade.php です
img
1. /resources/views/layouts/app.blade.php(View) を作成(省略)
app.blade.phpを未作成の場合、以下コードを貼り付けます。
2. /resources/views/books.blade.php(View) を作成
💡 【コード解説 / @yieldと@sectionの部分は何している?】
親のapp.blade.php
のところに、子のbooks.blade.php
から
までの部分を挿入している
④ルート定義(ルーティング)を作成
これまでにDB+Model(データの操作を担当)、View(表示を担当)を作成しました ここでは、Webアプリの玄関口(受付)となるRoutingを作成していきましょう
img
1. /routes/web.php(ルート定義)に以下の記述を追加
先頭部
中間
2. プレビュー画面で確認
無事に本のタイトルを入力するフォームが表示されていればOK
⑤CRUD機能実装(登録)
1. /routes/web.php(ルート定義)を編集
2. formを送信した後にDBに登録処理ができているか、phpMyAdminで確認
⑥CRUD機能実装(表示)
本項では、登録したデータの一覧を取得し表示する機能を実装していきましょう
1. /routes/web.php(ルート定義)を編集
2. /resources/views/books.blade.php(View)
< !-- Book: 既に登録されてる本のリスト -->の下に追加
3. プレビュー画面で、一覧表示できているか確認
💡解説 / @foreach
Bladeテンプレートエンジンに備わっている便利な繰り返し処理をしてくれる機能 PHPの
foreach
と同じ感じで書ける💡+α / デバッグ
viewで
$books
に値が入っているか確かめたい時は{{ddd($books)}}
を仕込んでみよう ※Controllerでddd($books);
をするのもGOOD⑦CRUD機能実装(削除)
1. books.blade.php(View)に削除ボタンを追加
< !-- 本: 削除ボタン -->下の
2. web.phpに「本を削除」のルート定義を追加編集
⑧CRUD機能実装(更新)
1. books.blade.php(View)に更新ボタンを追加
削除ボタンの
2. booksedit.blade.phpをview配下に新規作成し、以下コードを貼り付け
3. web.php(ルート定義)に更新画面表示と更新処理を追加