こんにちは、GMOアドマーケティングのR.Yです。
今回はLaravelでWebアプリケーションを作っていきたいと思います。普段はRuby on Railsを使って開発しているのですが、今回は自分の見識を広げるためにRuby on Rails以外でWebアプリを作ってみる、という趣旨でいきたいと思います。
Laravelとは
Laravelとは2011年6月にリリースされたPHPのフレームワークです。
Google Trend(他PHPフレームワークとの比較)
PHPフレームワークの中では比較的後発ながら、今や世界一のシェア率を誇ります。MVCモデルを使っており、豊富なコマンドやプログラムの拡張性の高さが特徴としてあげられます。
同じWebフレームワークであるRailsと比較しても、
Google Trend(Ruby on Railsとの比較)
2019年を境に常にRailsを上回る人気度で推移しています。
環境
PHP 7.1.33
Laravel Framework 5.8.38
準備
RubyのBundlerのように、PHPではComposerでパッケージを管理しているので事前にインストールしておきます。
1 2 |
brew install composer composer -v |
インストーラーをインストールします。
1 |
composer global require "laravel/installer" |
laravelコマンドを使用するためにパスを通します。
1 2 3 4 5 |
export PATH="$PATH:/Users//.composer/vendor/bin" source ~/.bashrc source ~/.bash_profile laravel -v |
PHPをインストール。
1 |
brew install php@7.4 |
Laravelアプリケーション作成。
1 |
laravel new hogehoge |
サーバ起動。
1 |
php artisan serve |
※本記事の以降の画像はすべて当社が作成したものです
この画面が確認できたら準備OK。固有のコマンドに違いはあるものの、各種インストールからアプリケーション作成、サーバ起動などここまでの流れはRailsとほぼ同じで非常に快適!
ログイン機能
Laravelには認証機能やそれに必要な諸々を一瞬で作ってくれるコマンドがあるので実行します。
1 |
php artisan make:auth |
認証機能作成と同時にUserモデルとUserテーブルのマイグレーションファイルができました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreateUsersTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('users', function (Blueprint $table) { $table->bigIncrements('id'); $table->string('name'); $table->string('email', 191)->unique(); $table->timestamp('email_verified_at')->nullable(); $table->string('password'); $table->rememberToken(); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('users'); } } |
マイグレーションファイルができたので↓を実行しマイグレート
1 |
php artisan migrate |
1 2 3 4 5 |
Migration table created successfully. Migrating: 2014_10_12_000000_create_users_table Migrated: 2014_10_12_000000_create_users_table (0.56 seconds) Migrating: 2014_10_12_100000_create_password_resets_table Migrated: 2014_10_12_100000_create_password_resets_table (0.56 seconds) |
見事成功!
http://127.0.0.1:8000/loginから実際にログインできます。
Railsで同様のことをやろうとすると、Gemにdeviseを追加するなどしてから画面とルーティングの設定を行って初めてログインできるので、認証機能やそれに必要な画面をコマンド一つで作ってくれるのはとても便利!!!!!
一覧画面作成
次にCRUDを試してみたいので、アカウント一覧画面を作っていきます。ここは何の一覧でも良いのですが何となく今回はアカウントでいきます。
まずマイグレーションファイルを作成
1 |
php artisan make:migration create_accounts_table |
↑のコマンドを実行し、それによって作成される database/migrations/2021_07_08_092258_create_accounts_table.phpを↓のように変更します。
※ファイル名は人により異なります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreateAccountsTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('accounts', function (Blueprint $table) { $table->bigIncrements('id'); $table->string('name'); $table-> integer('age'); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('accounts'); } } |
修正後↓を実行しマイグレート
1 |
php artisan migrate |
Migration table created successfully. が表示されればOK。
ここまでのマイグレーションファイルの作成、コマンドでマイグレートの流れはRailsとほぼ同じ。
続いて↓でアカウントコントローラを作成します。
1 |
php artisan make:controller Admin/AccountsController --resource |
コントローラができたらroutes/web.phpを↓のように変更します。
1 2 3 4 5 6 7 8 9 |
Route::get('/home', 'HomeController@index')->name('home'); ↓↓↓↓↓ 上の部分を下記に変更 Route::prefix('admin')->group(function(){ Route::resources([ '/accounts' => 'Admin\AccountsController' ]); }); |
これで/admin/accountsのリクエストに対してアカウントコントローラのメソッドを呼ぶことを決めておきます。ルーティングに関しては、書き方はRailsと似ているのですがRailsよりも少しごちゃごちゃしているなと思いました。
そしてAdmin/AccountController.phpを↓のように変更。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<?php namespace App\Http\Controllers\Admin; use App\Account; use Illuminate\Http\Request; use App\Http\Controllers\Controller; class AccountsController extends Controller { /** * Display a listing of the resource. * * @return \Illuminate\Http\Response */ public function index() { $accounts = Account::all(); return view('admin.accounts',['accounts' => $accounts]); } |
これでhttp://127.0.0.1:8000/admin/accountsにアクセスした時にアカウント一覧の情報とアカウント一覧画面を組み合わせてブラウザに渡す処理が完成しました。LaravelもRailsもMVCモデルを使用しているのでここらへんはそっくりな印象です。
一覧画面は別で用意する必要があるので、resources/views/admin/accounts.blade.phpを作成し中身を↓のようにします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<h1>一覧画面!</h1> <table id="admin_table"> <tr> <th></th> <th>アカウント名</th> <th>年齢</th> </tr> @foreach($accounts as $account) <tr> <td></td> <td>{{ $account->name }}</td> <td>{{ $account->age }}</td> </tr> @endforeach </table> |
変更後サーバーを起動しhttp://127.0.0.1:8000/admin/accountsを確認してみます。
これでOK!アカウントが表示されてないですが、そもそもアカウントが1人も登録されていないのでこれで大丈夫。
登録画面
続いて一覧画面に登録画面へのリンクを作ります。まずaccounts.blade.phpに↓を加えます。
1 2 3 |
<div id="right_module"> <div id="create_item"><a href="{{ route('accounts.create') }}" class="whitelink">アカウント登録へ</a></div> </div> |
続いてAccountsControllerで
1 2 3 4 5 6 7 8 9 |
/** * Show the form for creating a new resource. * * @return \Illuminate\Http\Response */ public function create() { return view('admin.account_create'); } |
をindexメソッドの下に追加します。これで「アカウント登録へ」を押した時にアカウント登録画面へ遷移する機能を追加しました。
最後に登録画面を作ります。先ほどと同じような手順でresources/views/admin/account_create.blade.phpを作成し↓のようにしました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<h1>登録画面!</h1> @csrf <div class="form_block"> アカウント名 @if ($errors->has('name')) <p class="red">{{ $errors->first('name') }}</p> @endif </div> <div class="form_block"> 年齢 @if ($errors->has('email')) <p class="red">{{ $errors->first('email') }}</p> @endif </div> <div class="form_block"> <button type="submit" id="send" class="green_button whitelink"> {{ __('Create') }} </button> </div> |
これで登録画面完成です。確認してみましょう。
完成!!!
登録機能
登録画面を作成できましたが、いじってみるとわかりますが登録はできません。この段階では登録画面を作っただけで登録できるわけではありません。なので「登録ボタン」を押した時にDBに登録する機能を実装していきます。まずアカウントコントローラで以下のstoreメソッドをcreateメソッドの下に追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
/** * Store a newly created resource in storage. * * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\Response */ public function store(Request $request) { //Accountモデルを使って新規作成 Account::create([ 'name' => $request->name, 'age' => $request->age, ]); //登録が終わったらアカウントリスト一覧画面にリダイレクトさせる return redirect( '/admin/accounts' ); } |
これによって「Createボタン」が押された時に入力されている名前と年齢を受け取ってアカウントを作成するメソッドが完成しました。これで登録処理もできるようになったので試しに登録してみましょう。
追加できました!!
本当はCRUD全て試したかったのですが、結構長くなってしまいそうなのでここまで。
まとめ
今回はLaravelを使って簡単なWebアプリケーションを作ってみました。使ってみた感想としては、マイグレーションを使ったDBの変更や基本的なCRUDのやり方などRailsと似ている部分が多く直感的に扱うことができたのでとても使いやすかったです。普段Railsを使うことが多く、LaravelやPHPならではの書き方には少し違和感を覚えるところがありましたが、Railsがある程度できれば問題なく開発できそうだなと感じました。また、Railsと比べて便利なところも多く、特に認証機能とログイン関連の画面を一瞬で作ってくれるコマンドはRailsにはないので非常に便利だなと感じました。
一点気になった点として、Laravelは開発の規則が緩く色々な書き方ができるというところがありました。Railsではコントローラーやモデルの命名規則であったりディレクトリ構成が最初から決まっていますが、対してLaravelはそれらがRailsほどしっかり決まっていません。なので、Railsとは違って比較的自由な規則で開発できるのでそこは利点だと思うのですが、開発の規模が大きくなるにつれてこれらの規則が曖昧になり、自由度の高さが裏目に出てしまう場合もありそうだなと感じました。ここら辺の仕様については一長一短なので、RailsとLaravelで迷ったら自分の開発スタイルに合わせて決めれば良いのではないでしょうか。また、今回のような簡単な開発ではそこまで気にならなかったので、規模の小さい開発の場合はLaravelの方が適しているのではないかと感じました。
Laravelはリリースされたのが2011年ということで、2004年にリリースされたRailsと比べるとどうしても記事や書籍の数で劣ってしまうようです。しかし、シェア率は年々上昇していてRailsを追い抜く勢いなので、いつかLaravelの方が主流になる時代が来るかもしれませんね。個人的にはRailsの方が好きですが、Laravelも触ってみて面白いなと感じたので機会があればまた使ってみたいです!
以上ここまで読んでいただきありがとうございました🙇♂️
Ruby on Railsを使った開発、プロダクトの脆弱性診断などをやってます
オレンジ色と犬と猫と食べることと歌うこととピアノが好きです。