Blogブログ

システム

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)

成功していますね。

ではここで、燻製香る鯛めしをご覧ください。

事務所の風景です。

では気を取り直して、今から同じ容量でadminを作成してみましょう。