Laravel ちょっとだけやってみた

PHP 製の Ruby on Rails みたいな感じのフレームワーク、Laravel を触ってみることにした。

目次

Composer をインストールする

PHP に関しては何も設定していない素の Mac 環境だったので、まずは PHP のパッケージ管理ツールである Composer のインストールから。

$ php --version
PHP 8.1.0 (cli) (built: Nov 28 2021 04:13:56) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.1.0, Copyright (c) Zend Technologies
    with Zend OPcache v8.1.0, Copyright (c), by Zend Technologies

$ brew install composer
$ composer --version
Composer version 2.1.14 2021-11-30 10:51:43

Homebrew でササッと入れる。

Laravel をインストールする

この時まだ気づいていないのだが、以下の Laravel v4.2 のページを見ながら作業してしまっていた。

$ composer global require "laravel/installer=~1.1"
Changed current directory to /Users/neo/.composer
./composer.json has been created
Running composer update laravel/installer
Loading composer repositories with package information
Updating dependencies
Lock file operations: 19 installs, 0 updates, 0 removals
  - Locking guzzlehttp/guzzle (6.5.5)
  - Locking guzzlehttp/promises (1.5.1)
  - Locking guzzlehttp/psr7 (1.8.3)
  - Locking laravel/installer (v1.5.0)
  - Locking psr/container (1.1.2)
  - Locking psr/http-message (1.0.1)
  - Locking ralouphie/getallheaders (3.0.3)
  - Locking symfony/console (v4.4.34)
  - Locking symfony/deprecation-contracts (v2.5.0)
  - Locking symfony/filesystem (v4.4.27)
  - Locking symfony/polyfill-ctype (v1.23.0)
  - Locking symfony/polyfill-intl-idn (v1.23.0)
  - Locking symfony/polyfill-intl-normalizer (v1.23.0)
  - Locking symfony/polyfill-mbstring (v1.23.1)
  - Locking symfony/polyfill-php72 (v1.23.0)
  - Locking symfony/polyfill-php73 (v1.23.0)
  - Locking symfony/polyfill-php80 (v1.23.1)
  - Locking symfony/process (v4.4.35)
  - Locking symfony/service-contracts (v2.5.0)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 19 installs, 0 updates, 0 removals
  - Downloading guzzlehttp/promises (1.5.1)
  - Downloading ralouphie/getallheaders (3.0.3)
  - Downloading psr/http-message (1.0.1)
  - Downloading guzzlehttp/psr7 (1.8.3)
  - Downloading symfony/polyfill-php80 (v1.23.1)
  - Downloading symfony/process (v4.4.35)
  - Downloading symfony/polyfill-ctype (v1.23.0)
  - Downloading symfony/filesystem (v4.4.27)
  - Downloading symfony/deprecation-contracts (v2.5.0)
  - Downloading psr/container (1.1.2)
  - Downloading symfony/service-contracts (v2.5.0)
  - Downloading symfony/polyfill-php73 (v1.23.0)
  - Downloading symfony/polyfill-mbstring (v1.23.1)
  - Downloading symfony/console (v4.4.34)
  - Downloading symfony/polyfill-php72 (v1.23.0)
  - Downloading symfony/polyfill-intl-normalizer (v1.23.0)
  - Downloading symfony/polyfill-intl-idn (v1.23.0)
  - Downloading guzzlehttp/guzzle (6.5.5)
  - Downloading laravel/installer (v1.5.0)
  - Installing guzzlehttp/promises (1.5.1): Extracting archive
  - Installing ralouphie/getallheaders (3.0.3): Extracting archive
  - Installing psr/http-message (1.0.1): Extracting archive
  - Installing guzzlehttp/psr7 (1.8.3): Extracting archive
  - Installing symfony/polyfill-php80 (v1.23.1): Extracting archive
  - Installing symfony/process (v4.4.35): Extracting archive
  - Installing symfony/polyfill-ctype (v1.23.0): Extracting archive
  - Installing symfony/filesystem (v4.4.27): Extracting archive
  - Installing symfony/deprecation-contracts (v2.5.0): Extracting archive
  - Installing psr/container (1.1.2): Extracting archive
  - Installing symfony/service-contracts (v2.5.0): Extracting archive
  - Installing symfony/polyfill-php73 (v1.23.0): Extracting archive
  - Installing symfony/polyfill-mbstring (v1.23.1): Extracting archive
  - Installing symfony/console (v4.4.34): Extracting archive
  - Installing symfony/polyfill-php72 (v1.23.0): Extracting archive
  - Installing symfony/polyfill-intl-normalizer (v1.23.0): Extracting archive
  - Installing symfony/polyfill-intl-idn (v1.23.0): Extracting archive
  - Installing guzzlehttp/guzzle (6.5.5): Extracting archive
  - Installing laravel/installer (v1.5.0): Extracting archive
6 package suggestions were added by new dependencies, use `composer suggest` to see details.
Generating autoload files
14 packages you are using are looking for funding.
Use the `composer fund` command to find out more!

$ export PATH="${HOME}/.composer/vendor/bin:${PATH}"

$ laravel
Laravel Installer 1.5.0

Usage:
  command [options] [arguments]

Options:
  -h, --help            Display this help message
  -q, --quiet           Do not output any message
  -V, --version         Display this application version
      --ansi            Force ANSI output
      --no-ansi         Disable ANSI output
  -n, --no-interaction  Do not ask any interactive question
  -v|vv|vvv, --verbose  Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug

Available commands:
  help  Display help for a command
  list  List commands
  new   Create a new Laravel application.

とりあえず laravel コマンドが入った。コレはプロジェクトを新規作成するためのコマンドらしい

Laravel プロジェクトを作ってみる

laravel new コマンドでプロジェクトを作ってみようとするが、エラーが出てしまった。

$ laravel new practice-laravel
Crafting application...

In RequestException.php line 113:
                                                                                                     
  Client error: `GET http://cabinet.laravel.com/latest.zip` resulted in a `404 Not Found` response:  
  <html>                                                                                             
  <head><title>404 Not Found</title></head>                                                          
  <body>                                                                                             
  <center><h1>404 Not Found</h1></center>                                                            
  <hr><center>nginx</c (truncated...) 

ココで何やら、自分が参考にしていたページが古いことに気付く。

Composer で Laravel Installer をインストールし直してみると、バージョンが 1.5.0 から 4.2.9 に上がった。

$ composer global remove laravel/installer
$ composer global require laravel/installer
$ laravel --version
Laravel Installer 4.2.9

$ laravel new practice-laravel

 _                               _
| |                             | |
| |     __ _ _ __ __ ___   _____| |
| |    / _` | '__/ _` \ \ / / _ \ |
| |___| (_| | | | (_| |\ V /  __/ |
|______\__,_|_|  \__,_| \_/ \___|_|

Creating a "laravel/laravel" project at "./practice-laravel"
Installing laravel/laravel (v8.6.9)
  - Downloading laravel/laravel (v8.6.9)
  - Installing laravel/laravel (v8.6.9): Extracting archive
Created project in /Users/neo/practice-laravel
> @php -r "file_exists('.env') || copy('.env.example', '.env');"
Loading composer repositories with package information
Updating dependencies
Lock file operations: 110 installs, 0 updates, 0 removals
... () ...
  - Locking webmozart/assert (1.10.0)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 110 installs, 0 updates, 0 removals
... () ...
  - Downloading phpunit/phpunit (9.5.10)
... () ...
  - Installing phpunit/phpunit (9.5.10): Extracting archive
62 package suggestions were added by new dependencies, use `composer suggest` to see details.
Package swiftmailer/swiftmailer is abandoned, you should avoid using it. Use symfony/mailer instead.
Generating optimized autoload files
> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover --ansi
Discovered Package: facade/ignition
Discovered Package: fruitcake/laravel-cors
Discovered Package: laravel/sail
Discovered Package: laravel/sanctum
Discovered Package: laravel/tinker
Discovered Package: nesbot/carbon
Discovered Package: nunomaduro/collision
Package manifest generated successfully.
77 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
> @php artisan vendor:publish --tag=laravel-assets --ansi --force
No publishable resources for tag [laravel-assets].
Publishing complete.
> @php artisan key:generate --ansi
Application key set successfully.

Application ready! Build something amazing.

作成されたプロジェクトを見てみる。

$ cd ./practice-laravel/

$ ls -1 -p
README.md
app/
artisan
bootstrap/
composer.json
composer.lock
config/
database/
package.json
phpunit.xml
public/
resources/
routes/
server.php
storage/
tests/
vendor/
webpack.mix.js

なんかいっぱいできてる。

開発サーバを起動してみる

artisan というのは Laravel を扱う CLI ツール。コレを使って開発サーバを起動できる。

$ php artisan serve
# http://localhost:8000/

PHP ファイルを変更すると即座に変更が反映される。

ココでこのプロジェクトに入っている Laravel のバージョンを確認してみると、8.75.0 であることが分かった。

$ php artisan --version
Laravel Framework 8.75.0

そこで、以下のリファレンスを見ながら作業することにした。

ルーティングをイジってみる

RoR や Express などを触ったことがあれば何となく分かると思うが、Laravel もまた Router → Controller と別かれる構成である。まずは Router をイジってみて、好きなエンドポイントを生やしてみる。

Route::get('/greeting', function () {
    return 'Hello World';
});

既存の ./routes/web.php ファイルに、上のようなコードを追記してやる。コレで http://localhost:8000/greeting ができ、アクセスすると「Hello World」と表示される。

コントローラを作ってみる

上の例では Router 内でコンテンツを返していたが、今度はコントローラを作り、コントローラにレスポンスを組み立ててもらう。

use App\Http\Controllers\UserController;

Route::get('/users', [UserController::class, 'index']);

↑ こんな感じで、UserController をインポートし、index 関数を紐付けるコードを追記する。

<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;

class UserController extends Controller {
    // 一覧表示するテイ
    public function index() {
        return 'User Index';
    }
}

↑ 今回はコンテンツ部分は完全なダミー、「User Index」の文言を返すだけだが、とりあえずコレで http://localhost:8000/users が出来る。

今回はココまで

Laravel も RoR に似た感じで、色々と規約が隠蔽されてる感じ。MVC 構成を堅牢に保つためにはこうしたフレームワークが必要だろうけど、他のフレームワークでやってたことを Laravel 用に覚え直さないといけない感があって、初学者よりも中級者以降はより面倒臭がってしまうかもしれない。w