Laravel ちょっとだけやってみた
PHP 製の Ruby on Rails みたいな感じのフレームワーク、Laravel を触ってみることにした。
目次
- Composer をインストールする
- Laravel をインストールする
- 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...)
ココで何やら、自分が参考にしていたページが古いことに気付く。
- 参考 : Laravel で「Server error: GET http://cabinet.laravel.com/latest.zip resulted in a 522 Origin Connection Time-out response:」エラー - Qiita
- 参考 : php - Why do I get a laravel error while creating a new project? - Stack Overflow
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
そこで、以下のリファレンスを見ながら作業することにした。
- 参考 : 8.x Laravel
- このリファレンスが良さそうだ
- 参考 : インストール 8.x Laravel
- 開発サーバの起動方法
- 参考 : 設定 8.x Laravel
- 設定ファイルに関して
- 参考 : ディレクトリ構造 8.x Laravel
- ディレクトリ構成の説明
ルーティングをイジってみる
- 参考 : ルーティング 8.x Laravel
RoR や Express などを触ったことがあれば何となく分かると思うが、Laravel もまた Router → Controller と別かれる構成である。まずは Router をイジってみて、好きなエンドポイントを生やしてみる。
./routes/web.php
Route::get('/greeting', function () {
return 'Hello World';
});
既存の ./routes/web.php
ファイルに、上のようなコードを追記してやる。コレで http://localhost:8000/greeting
ができ、アクセスすると「Hello World」と表示される。
コントローラを作ってみる
- 参考 : コントローラ 8.x Laravel
上の例では Router 内でコンテンツを返していたが、今度はコントローラを作り、コントローラにレスポンスを組み立ててもらう。
./routes/web.php
use App\Http\Controllers\UserController;
Route::get('/users', [UserController::class, 'index']);
↑ こんな感じで、UserController をインポートし、index
関数を紐付けるコードを追記する。
./app/Http/Controllers/UserController.php
<?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
- 参考 : Laravel - Wikipedia
- 参考 : Artisanコマンド(早見表) - Laravel学習帳
- 参考 : 【Laravel】Illuminateとは何か?ファイルはどこにあるのか? - Qiita
use Illuminate\Routing\Controller as BaseController;
というように、Illuminate という名前空間から色々インポートされている- Illuminate は Laravel 4 のコードネームで、Laravel の各種コンポーネントがまとめられている