RAKUS Developers Blog | ラクス エンジニアブログ

株式会社ラクスのITエンジニアによる技術ブログです。

【初心者向け】Laravel 入門 まとめ

f:id:tech-rakus:20201203194217p:plain

はじめに

初めまして。配配メール開発課 Jazumaです。 今回はPHPフレームワークLaravelの環境構築~基本機能の動作確認を行います。

Linux環境での作業を前提としていますのでWindowsMacではこの記事の手順でLaravelの環境構築をすることができません。予めご了承ください。

Laravelとは

Laravelは2011年にリリースされたオープンソースPHPフレームワークであり、認証・データベースへのアクセス・入力値のチェックなどWeb開発に必要な機能が一通り備わっています。 Laravelの特徴として、MVCモデルが採用されているということが挙げられます。

MVCモデルとはアプリケーション開発によくある処理をModel、View、Cotrollerの3つに分類して実装する手法です。 Model、View、Controllerはそれぞれ次のような機能を持ちます。

  • M: Model... データ処理をする。 取得したデータをControllerに渡す機能も持つ。

  • V: View... ユーザに表示する画面。Controllerにリクエストを送ったり、Controllerが送ったレスポンスを画面に表示する。

  • C: Controller... Viewからリクエストを受け取る。また、Modelから受け取った処理の結果をViewに対してレスポンスとして渡す機能を持つ。


MVCモデルは機能ごとにクラスが明確に分かれているため保守性の高いプログラムを簡単に書くことができるというメリットがあり、Laravelも例外ではありません。

Laravelのメリット

Web開発をするにあたって、Laravelには以下のようなメリットがあります。

  • 学習コストが比較的低い

前述の通りLaravelはMVCモデルに準拠しているため、どのファイルにどのような処理を書けばよいのか非常にわかりやすく、文法も単純なものが多いです。 そのため初心者でもWebアプリを効率的に開発することができます。


  • Webアプリに必要な機能を簡単に実装できる

Laravelでは認証・エラー処理などのWebアプリケーションに不可欠な機能を簡単に実装することができます。例えば、「ユーザがリクエストしたページが存在しない場合に404エラーページを返す」という処理は404.blade.phpというViewファイルを作成するだけで実装できてしまいます。フレームワークが裏側でよしなにやってくれるというわけですね。この他にもコマンドを実行するだけで認証機能の実装に必要なControllerやViewファイルが作成されるなど、Web開発をスムーズに進めることができます。


  • コマンドが豊富

LaravelにはArtisanというコマンドラインツールがデフォルトで備わっておりコマンドラインからControllerやModelを作成したり、データベースを操作したりすることができます。

artisanコマンドの一例を以下に示します。(これらはほんの一部分にすぎません。 artisanコマンドの一覧が見たい時はphp artisan listを実行します。)

php artisan serve # ビルトインサーバを起動する
php artisan make:model[controller] [ModelやController名] # Model[Controller]を作成する
php artisan tinker #コマンドライン上でLaravelのプログラムを実行するモードを起動

動作環境

私は以下の環境で作業を行っています。

  • ホストOS: Windows10 Home

  • ゲストOS: WSL2 Ubuntu20.04

  • PHP 7.4

  • Laravel 8.16

  • VSCode ver1.51

Laravelの環境構築

まずは以下の手順でLaravelの環境構築を行います。

PHPのインストール

LaravelはPHPフレームワークですので使う前にPHPをインストールする必要があります。 既にPHPがインストール済みの場合はこの手順は省略しても問題ありません。

以下のコマンドでPHPをインストールします。

#add-apt-repository コマンドをインストール
$ sudo apt-get install software-properties-common \
# PHPをインストールするするためのppa:ondrej/phpリポジトリを追加
add-apt-repository ppa:ondrej/php \
# パッケージを最新化
sudo apt update \
# PHPをインストール
apt-get install php7.4


php -vコマンドを実行してバージョンが表示されていれば正確にインストールされています。

PHP 7.4.7 (cli) (built: Jun 12 2020 07:44:38) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.7, Copyright (c), by Zend Technologies

Laravelのインストールや動作に必要なモジュールのインストール


Laravelの公式Webサイトでは、Laravelを使うために以下のようなPHPのモジュールが必要になると書かれています。

  • BCMath PHP Extension

  • Ctype PHP Extension

  • Fileinfo PHP extension

  • JSON PHP Extension

  • Mbstring PHP Extension

  • OpenSSL PHP Extension

  • PDO PHP Extension

  • Tokenizer PHP Extension

  • XML PHP Extension

  • ZIP PHP Extension

初期状態ではBCMath, Mbstring, XMLがインストールされていません。また、後述するComposerでLaravelのインストーラコマンドを実行するにあたってzip拡張機能が必要になるので合わせてインストールします。

$ sudo apt-get php7.4-bcmath php7.4-mbstring php7.4-xml php7.4-zip

このとき、各種モジュールのバージョンは必ずphp本体のバージョンと揃えるようにしてください。(モジュールのバージョンを指定しないことが原因でエラーがよく発生します)

モジュールがインストールできたらphp -mコマンドで正しくパッケージがインストールできているか確認します。

$ php -m

[PHP Modules]
bcmath
ctype
fileinfo
json
mbstring
openssl
PDO
tokenizer
xml
zip

(見やすくするために必要なモジュールのみを記載しています。)

Composerをインストールする

ComposerとはPHPで開発するのに必要なパッケージやライブラリの依存関係を解決してくれるツールです。例えばLaravelでの開発にパッケージAが必要でパッケージAの導入にはパッケージBが必要でパッケージBを使うにはパッケージCが...というようなことになった場合、Composerがないとそれらを1つ1つインストールしなければなりません。このようなやり方ではインストール漏れやパッケージ毎のバージョン違いでエラーが発生しやすいです。

それに対して、Composerを導入していればパッケージAをインストールするとそれを使うのに必要なパッケージBやCを自動でインストールしてくれる上、バージョン管理も勝手にやってくれます。このような利点からComposerはPHPの各種フレームワークで開発する場合ほぼ必ず導入されており、LaravelでもComposerが活用されています。

以下のコマンドでComposerをインストールします。

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === 'e0012edf3e80b6978849f5eff0d4b4e4c79ff1609dd1e613307e16318854d24ae64f26d17af3ef0bf7cfb710ca74755a') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"

カレントディレクトリにComposerがインストールされますが、のちの手順を簡略化するためにパスの通っているディレクトリに移動させます。

sudo mv  composer.phar /usr/local/bin/composer

Laravelのインストール・プロジェクトの作成

Composerの配置が完了したら以下のコマンドでLaravelのインストーラをダウンロードします。

$ composer global require "laravel/installer"

Laravelインストーラのダウンロードが終わり次第、.bashrcを編集してComposerのvendor/binディレクトリにパスを通します。

$ vim ~/.bashrc
export PATH="$PATH:$HOME/.config/composer/vendor/bin"

パスを通せたら、Laravelのプロジェクトを作成するためのディレクトリを作り、そのディレクトリに移動してLaravel new コマンドを実行します。

$ mkdir Laravel_app

$ cd Laravel_app

$ Laravel new sample_app
.
.
  - Installing ralouphie/getallheaders (3.0.3): Downloading (100%)         
  - Installing guzzlehttp/psr7 (1.7.0): Downloading (100%)         
  - Installing guzzlehttp/promises (1.4.0): Downloading (100%)         
  - Installing guzzlehttp/guzzle (7.2.0): Downloading (100%)         
  - Installing dnoegel/php-xdg-base-dir (v0.1.1): Downloading (100%)         
  - Installing nikic/php-parser (v4.10.2): Downloading (100%)         
  - Installing psy/psysh (v0.10.4): Downloading (100%)         
  - Installing laravel/tinker (v2.5.0): Downloading (100%)      
.
.
.
Package manifest generated successfully.
72 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
> @php artisan key:generate --ansi
Application key set successfully.

Application ready! Build something amazing.

Laravel newコマンドでアプリケーションの開発に必要なパッケージが自動でインストールされていきます。 これでLaravelの開発をする準備ができました。

「Application ready! Build something amazing.」というメッセージが表示されたらLaravel_appディレクトリで以下のコマンドを実行してLaravelのバージョンを確認してみましょう。

$ php artisan -v
Laravel Framework 8.16.1

Laravelの環境構築が無事完了しました。ここから先ではいよいよLaravelの機能を使っていきます。

Laravelの基本機能確認

ビルトインサーバの起動

LaravelではWebサーバを構築しなくても備え付けのサーバ(ビルトインサーバ)によってWebアプリケーションの動作確認をすることができます。(ビルトインサーバはセキュリティや機能面で実用には堪えません。あくまでも開発中の動作確認に使うくらいの使用感です)

以下のコマンドを実行してLaravelのビルトインサーバを起動します。

$ php artisan serve

Starting Laravel development server: http://127.0.0.1:8000
[Mon Nov 30 20:47:59 2020] PHP 7.4.12 Development Server (http://127.0.0.1:8000) started

ブラウザの検索窓にlocalhost:8000と入力してアクセスします。

コメント 2020-12-01 074043.png


上の画像のようにLaravelの起動画面が表示されれば成功です。

ルーティングの設定

ルーティングとは「このURLを呼び出したらこのコントローラを呼び出す」というようにURLとコントローラの対応付けをすることです。Laravelではroutes/web.phpでルーティングを設定します。

web.phpはデフォルトでは以下のようになっています。(コメント部分は省略)

<?php

use Illuminate\Support\Facades\Route;

Route::get('/', function () {
    return view('welcome');
});

上記のルーティングの内容を簡単にまとめると、「第一引数のURLがgetメソッドで呼ばれたときに第二引数内の関数を実行する」というものです。ここでは '/'、つまりホーム画面(localhost:8000)にアクセスしたときにwelcome.blade.phpという名前のViewファイルを返す処理になっています。

先ほどビルトインサーバを起動した際にこのルーティングが呼び出されたというわけですね。

続いて実際にルーティングを定義してみましょう。web.phpを以下のように編集します。

<?php

use Illuminate\Support\Facades\Route;

Route::get('/', function () {
    return view('welcome');
});

//追記部分
Route::get('/hello', function () {
    return 'hello';
});

新しく追加したルーティングは、'/hello'というURLをgetメソッドで呼び出すと'hello'という文字列を画面に表示するという内容です。Viewファイルではなく単に文字列を返すのは実用的ではありませんが今回は動作確認のためにこのような処理になっています。

それでは実際にlocalhost:8000/helloにアクセスしてみます。

f:id:Jazuma:20201201225504p:plain

上の画像のようにhelloと表示されていれば成功です。

コントローラの作成

続いてコントローラを作成します。コマンドラインから以下のコマンドを実行します。


$ php artisan make:controller HelloController
Controller created successfully.

コマンドラインに上のようなメッセージが表示されていれば成功です。Laravelが自動でコントローラクラスのファイルを作成してくれます。

Laravelではコントローラクラスはapp/Http直下にControllerクラスのファイルが作成されます。 app/Httpディレクトリ直下にHelloController.phpというファイルが作成されていることを確認しましょう。

f:id:Jazuma:20201201231018p:plain

無事作成されていますね。

続いてHelloController.phpを以下のように変更します。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class HelloController extends Controller
{
   //新規追加のメソッド
    public function index()
    {
      return "hello, world";
    }
}

詳細は後述します。

さらに、web.phpの内容を変更します。

<?php

use Illuminate\Support\Facades\Route;

Route::get('/', function () {
    return view('welcome');
});

//変更箇所
Route::get('/hello', 'App\Http\Controllers\HelloController@index');

ルーティングの内容を「'/hello'がgetメソッドで呼び出されたら HelloControllerのindexメソッドを呼び出す」というように変えています。

HelloController.phpのindexメソッドはhello, worldという文字列を返すという処理を行うので、先ほどと同じようにlocalhost:8000/helloにアクセスしてhello, worldと表示されていればokです。

Viewファイルの作成

Controllerの次はViewを触っていきます。 resources/viewsディレクトリの下にhello.blade.phpというファイルを作成し、次のような内容にします。

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  {{$message}}
</body>
</html>

次にコントローラクラスに手を加えます。冒頭で書いたようにLaravelはControllerからViewファイルを呼び出すという処理の流れになっていますので、コントローラ側でViewファイルを呼び出す処理を実装しなければなりません。indexメソッドを次のように書き変えてください。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class HelloController extends Controller
{
    public function index()
    {
    //変更箇所
      $message = "Hello Laravel!!";
      return view('hello', ['message' => $message]);
    }
}

変数$messageにHello, Laravel!!という文字列を代入しています。これはLaravel固有の記法というわけではなく、PHPそのものの文法です。 return文ではviewメソッドを返しており、第一引数でhello.blade.phpを返すようにしています。

少し複雑なのが第二引数の['message' => $message] という部分です。 これはViewファイルに配列でパラメータを渡すための引数で、ここではmessageというパラメータに上で宣言した変数$messageの値をセットしています。

つまり先ほどお見せしたhello.blade.php 内の$messageというパラメータにはHello, Laravel!!という文字列がセットされているというわけですね。(Viewファイルの$messageはあくまでもパラメータであり、HelloController.phpで宣言した変数$messageそのものではありません。)

それではlocalhost:8000/helloにアクセスしてみましょう。

f:id:Jazuma:20201201235824p:plain

上の画像のようにHello, Laravel!!と表示されているでしょうか?

最後にViewファイルの文法について簡単に解説したいと思います。


<body>
  {{$message}}
</body>


$messageを囲んでいる二重括弧 {{ }} にはどのような意味があるのでしょうか。大きく分けて2つの機能があります。1つはパラメータにセットされている値を展開するという機能です。この二重括弧をつけていないとHello, Laravel!!という文字列ではなく、$messageという文字列がそのまま出力されてしまいます。

もう1つはセキュリティ対策の機能です。{{ }} で囲まれたパラメータは単にその値が展開されるだけではなく、内部的にはhtmlentities()関数に渡されて値が表示されます。これにより、「<」や「&」などの特殊な意味を持つ文字がエスケープされて単なる文字として出力されます。

特殊文字が自動でエスケープされるため、XSS攻撃(悪意を持ったユーザがjavascriptやhtmlタグを入力して他のユーザのブラウザで実行させる攻撃)を大きな手間をかけることなく防ぐことができます。(XSSの詳細はこちら)

基本的な文法に沿って実装すれば意識せずともセキュリティ対策ができているというのもLaravelの大きな魅力です。

終わりに

Laravelを使うと簡単かつ安全にWebアプリケーションを開発することができるということを体感していただけたのではないでしょうか。 今回は紹介することができませんでしたがこの他にも認証機能の実装や、データベースの操作も非常にスムーズに行うことができます。

まだまだLaravelには便利な機能がありますので、また機会がありましたらご紹介したいと思います。

Copyright © RAKUS Co., Ltd. All rights reserved.