システム
laravel
2023.02.23
生肉食べながらLaravelの解説でもするか。
PHPといったらもうlaravelってくらいみんな使ってる。
今日は生肉でも食べながらlaravelを解説していこうと思います。
なかなかな肉仕入れました。
まずは、
環境構築をdockerでやっていきます。
ディレクトリ構造は下記です。
project
├ docker-compose.yml
├ docker
│ ├ php
│ │ ├ php.ini
│ │ └ Dockerfile
│ └ nginx
│ └ default.conf
└ server
よくあるやつです。
それぞれ、ファイルを記載していきます。
docker-compose.yml
version: '3'
services:
php:
container_name: php
build: ./docker/php
volumes:
- ./server:/var/www
nginx:
image: nginx
container_name: nginx
ports:
- 80:80
volumes:
- ./server:/var/www
- ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
depends_on:
- php
db:
image: mysql:5.7
container_name: db-host
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: database
MYSQL_USER: docker
MYSQL_PASSWORD: docker
TZ: 'Asia/Tokyo'
command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
volumes:
- ./docker/db/data:/var/lib/mysql
- ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf
- ./docker/db/sql:/docker-entrypoint-initdb.d
ports:
- 3306:3306
~
nginxのdefault.conf
server {
listen 80;
access_log /var/log/nginx/staging-access.log;
error_log /var/log/nginx/staging-error.log;
client_max_body_size 20M;
root /var/www/public/;
location / {
index index.html index.php;
try_files $uri $uri/ /index.php$is_args$args;
#auth_basic "nginx basic auth";
}
location ~ .*\.php?$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass php:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
location ~* \.(tpl|cfg|ini)$ {
deny all;
}
location ~ .*\.(swf|gif|jpg|jpeg|png|bmp|ico|js|css)$ {
expires 1d;
}
}
php.ini
[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"
phpのDockerfile
FROM php:7.2-fpm
COPY php.ini /usr/local/etc/php/
RUN apt-get update \
&& apt-get install -y zlib1g-dev mariadb-client \
&& docker-php-ext-install zip pdo_mysql
#Composer install
COPY --from=composer /usr/bin/composer /usr/bin/composer
ENV COMPOSER_ALLOW_SUPERUSER 1
ENV COMPOSER_HOME /composer
ENV PATH $PATH:/composer/vendor/bin
WORKDIR /var/www
RUN composer global require "laravel/installer"
docker-compose up -d を実行します。
# docker起動する
$ docker-compose up -d
# phpコンテナに入る
$docker exec -t xxxxxxx /bin/bash
$ cd
# 入ると/var/wwwに移動するのでLaravelプロジェクトを作る
$ vim composer.json
で、composer.jsonに例としてこれを描きます。
あ、もしphpコンテナの中でvimを使いたい場合は
apt-get install vim
をやってインストールをしておいてください。
{
"name": "laravel/laravel",
"type": "project",
"description": "The Laravel Framework.",
"keywords": [
"framework",
"laravel"
],
"license": "MIT",
"require": {
"php": "^7.2.5|^8.0",
"fideloper/proxy": "^4.4",
"laravel/framework": "^6.20.26",
"laravel/tinker": "^2.5"
},
"require-dev": {
"facade/ignition": "^1.16.15",
"fakerphp/faker": "^1.9.1",
"mockery/mockery": "^1.0",
"nunomaduro/collision": "^3.0",
"phpunit/phpunit": "^8.5.8|^9.3.3"
},
"config": {
"optimize-autoloader": true,
"preferred-install": "dist",
"sort-packages": true
},
"extra": {
"laravel": {
"dont-discover": []
}
},
"autoload": {
"psr-4": {
"App\\": "app/"
},
"classmap": [
"database/seeds",
"database/factories"
]
},
"autoload-dev": {
"psr-4": {
"Tests\\": "tests/"
}
},
"minimum-stability": "dev",
"prefer-stable": true,
"scripts": {
"post-autoload-dump": [
"Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
"@php artisan package:discover --ansi"
],
"post-root-package-install": [
"@php -r \"file_exists('.env') || copy('.env.example', '.env');\""
],
"post-create-project-cmd": [
"@php artisan key:generate --ansi"
]
}
}
で、
composer create-project laravel/laravel
を実行します。
もし万が一、ここでautoload系とかでエラーが起こっていたら、コンテナに入ってる状態で、
www配下を全部消しちゃってください。
そして、
composer global require laravel/installer
COMPOSER_MEMORY_LIMIT=-1 composer create-project –prefer-dist laravel/laravel
を実行してください。
これで動きます。
そうするとlaravelプロジェクトが生成できたかと思います。
そしたら
/var/www/html/laravel
に移動し、
composer install
を実行します。
次に、exitでローカルに戻った後に、
nginxのdocker/nginxにある、default.confの
/var/www/public
を
/var/www/html/laravel/public;
に変えてください。
そして
docker-compose stopをして
docker-compose up -dをしてください
そして
127.0.0.1にアクセスすると…
うまくいってるようですね。
では、気晴らしに生肉でも切っていきますね。
黒毛和牛のシンタマという部分を購入しました。
シンタマは とも三角 シンシン まるかわ かめのこ の部分です。
なかなか美味しそうですね。
東京都では牛肉は生では提供できないので自分たちで食べるしかしかないですね(福利厚生)
気を取り直してLaravelにコントローラーとアクションを作ってviewに流してみましょう。
とりあえずHelloコントローラーを作ってみましょう。
yamamoto@MacBook-Pro laravel_study % docker-compose exec php bash
root@d660b68c70f6:/var/www# ls
laravel
root@d660b68c70f6:/var/www# cd laravel/
root@d660b68c70f6:/var/www/laravel# ls
README.md artisan composer.json config package.json public routes storage vendor
app bootstrap composer.lock database phpunit.xml resources server.php tests webpack.mix.js
root@d660b68c70f6:/var/www/laravel# php artisan make:controller HelloController
Controller created successfully.
root@d660b68c70f6:/var/www/laravel#
こんな感じ。
Helloコントローラーが作られたかどlsうかを
/var/www/laravel/app/Http/Controllers
でみてみましょう。
ありますよね。
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class HelloController extends Controller
{
//
}
これを次のように編集してみます。
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class HelloController extends Controller
{
public function index ()
{
$company_name = 'FIELD';
$blanch_country = ['japan', 'vetnum', 'china','srialnka','indonesia'];
return view('index', compact('company_name', 'blanch_country'));
}
}
compact()を使うことで、viewに変数や配列を送ることができます。
変数や配列$を付けたくなりますがいらないので注意です。
次にroutingを追加します。
/laravel/routes/web.php を開いてください。
そのファイルの一番下に
Route::get(‘/company’, ‘HelloController@index’);
を追加しましょう。
これで、
127.0.0.1/company でアクセスしたときにHelloコントローラーのindexアクションを実行するようになります。
ではviewファイルを作っていきます。
resources/view/index.blade.phpを作りそこに、
@extends('common.layout')
@section('index')
<p>{{ $company_name }}</p>
@foreach ($blanch_country as $country)
{{ $country }}<br>
@endforeach
@endsection
を作成します。
同階層にcommonフォルダを作り、その中にlayout.blade.phpを作ります。
layout.blame.phpは@yield(‘index’)とだけ書いて保存します。
return view(‘index’, compact(‘company_name’, ‘blanch_country’));
と書いているので
index.blade.phpをみにいきます。
見に行くと、
common/layoutを読み込んでいて、そこには @yield(‘index’)とだけ記載されていますが、 このレイアウトに対してindexという名前の表示領域を確保してるというイメージです。 @section(‘index’) から@endsectionの間に書かれたコードがこの表示領域に代入されます。
ちなみに変数は {{ $company_name }} で表示されます。
{{}}はXXS対策だと思ってください。
さて、コントローラーとviewの表示までできたところで、お肉を並べます。
マイグレーションでもしてみますか。
ドキュメントルートの.envのmysql部分をこのように変更します。
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=database
DB_USERNAME=docker
DB_PASSWORD=docker
docker-compose.ymlの設定に合わせているだけです。
なので127.0.0.1のところは、ymlのDB_HOSTがdbならdbにしてください。
そして
/database/migrations
の中を見ると…
ありますね。
デフォルトのmigrationファイルたち。
これを実行してDBにテーブルを作ってみましょう。
ドキュメントルートで
php artisan migrate
を実行します。
yamamoto@MacBook-Pro laravel % php artisan migrate
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated: 2014_10_12_000000_create_users_table (0.07 seconds)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated: 2019_08_19_000000_create_failed_jobs_table (0.03 seconds)
こんな感じで成功するはずです。
syamamoto@MacBook-Pro laravel_study % docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2bc74008e50d nginx "/docker-entrypoint.…" 3 hours ago Up 3 hours 0.0.0.0:80->80/tcp nginx
1f638eebd3fb laravel_study_php "docker-php-entrypoi…" 3 hours ago Up 3 hours 9000/tcp php
ff2b5096ac93 mysql:5.7 "docker-entrypoint.s…" 3 hours ago Up 3 hours 0.0.0.0:3306->3306/tcp, 33060/tcp db-host
yamamoto@MacBook-Pro laravel_study % docker exec -it ff2b5096ac93 bash
root@ff2b5096ac93:/# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 7
Server version: 5.7.30 MySQL Community Server (GPL)
Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| database |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.05 sec)
mysql> use database;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show tables;
+--------------------+
| Tables_in_database |
+--------------------+
| failed_jobs |
| migrations |
| users |
+--------------------+
3 rows in set (0.01 sec)
できてますねー
じゃ、Userテーブルにseedsを使って値を入れていきましょう。
yamamoto@MacBook-Pro laravel % php artisan make:seeder UsersSeeder
Seeder created successfully.
yamamoto@MacBook-Pro laravel % vim database/seeds/UsersSeeder.php
yamamoto@MacBook-Pro laravel %
シードはこのようなファイルを用意しておきます。
<?php
use Illuminate\Database\Seeder;
class UsersSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
//
// テーブル内のデータを一旦全削除
\Illuminate\Support\Facades\DB::table('users')->truncate();
// データのインサート
DB::table('users')->insert([
[
'name' => '山田 太郎',
'email' => 'yamamoto@field.asia',
'password' => '',
'created_at' => '2021-06-07 21:00:00',
'updated_at' => '2021-06-07 21:00:00'
],
[
'name' => '鈴木 一郎',
'email' => 'yuya.miyazaki@field.asia',
'password' => '',
'created_at' => '2021-06-07 21:00:00',
'updated_at' => '2021-06-07 21:00:00'
],
]);
}
}
ちなみに06-07は私の誕生日です。
database/seeds/DatabaseSeeder.php
に、
<?php
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
/**
* Seed the application's database.
*
* @return void
*/
public function run()
{
#$this->call(\UsersSeeder::class);
$this->call([
UsersSeeder::class,
]);
}
}
を記載します。
このシーダーを実行するには
プロジェクトのルートで、
php artisan db:seed
です。
が、いくらやっても動かないこともあるかと思います。
そんな時は…
yamamoto@MacBook-Pro laravel % docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2bc74008e50d nginx "/docker-entrypoint.…" 4 hours ago Up 4 hours 0.0.0.0:80->80/tcp nginx
1f638eebd3fb laravel_study_php "docker-php-entrypoi…" 4 hours ago Up 4 hours 9000/tcp php
ff2b5096ac93 mysql:5.7 "docker-entrypoint.s…" 4 hours ago Up 4 hours 0.0.0.0:3306->3306/tcp, 33060/tcp db-host
yamamoto@MacBook-Pro laravel % docker exec -it 1f638 bash
phpコンテナに入り。
ドキュメントルートで、
composer dump-autoload
を実行します。
そしたらまたコンテナから出てきて、
ドキュメントルートで
php artisan db:seed
を実行すると
yamamoto@MacBook-Pro laravel % php artisan db:seed
Seeding: UsersSeeder
Seeded: UsersSeeder (0.05 seconds)
Database seeding completed successfully.
成功したようだな…
mysql> select * from users;
+----+----------+--------------------------+-------------------+----------+----------------+---------------------+---------------------+
| id | name | email | email_verified_at | password | remember_token | created_at | updated_at |
+----+----------+--------------------------+-------------------+----------+----------------+---------------------+---------------------+
| 1 | yamamoto | yamamoto@field.asia | NULL | xxx | NULL | 2021-06-07 21:00:00 | 2021-06-07 21:00:00 |
| 2 | miyazaki | yuya.miyazaki@field.asia | NULL | xxx | NULL | 2021-06-07 21:00:00 | 2021-06-07 21:00:00 |
+----+----------+--------------------------+-------------------+----------+----------------+---------------------+---------------------+
2 rows in set (0.00 sec)
成功していますね。
ではここで、燻製香る鯛めしをご覧ください。
事務所の風景です。