フリーランス 技術調査ブログ

フリーランス/エンジニア Ruby Python Nodejs Vuejs React Dockerなどの調査技術調査の備忘録

Laravel8 フォーム サンプル

はじめに

  • Laravel Adminで簡単にCRUDを作成してしまうと実際のユーザー側の画面の作成イメージがわかないので、コントローラーやフォームを作成して登録フォームを作成してみる

  • モデルの作成やデータベースの接続は過去の記事を参照 px-wing.hatenablog.com

コントローラーの作成

  • 次のコマンドを使用してフォームコントローラーを作成します。
$  php artisan make:controller CategoryController
  • コントローラー側のコード
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Category;

class CategoryController extends Controller
{
    public function index()
    {
        return view('add-category-form');
    }

    public function store(Request $request)
    {
        $category = new Category;
        $category->name = $request->name;
        $category->save();
        return redirect('add-category-form')->with('status', 'カテゴリの登録が完了致しました。');
    }
    
}

フォームのブレードファイルを作成する

  • カテゴリを追加するために、resources/viewsディレクトリ内にadd-category-form.blade.phpという名前の新しいブレードビューファイルを作成します。 次に、次のhtmlフォームコードをadd-category-form.blade.phpに追加します。
<!DOCTYPE html>
<html>
<head>
    <title>カテゴリ登録フォーム</title>
    <meta name="csrf-token" content="{{ csrf_token() }}">
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
</head>
<body>
<div class="container mt-4">
  @if(session('status'))
    <div class="alert alert-success">
        {{ session('status') }}
    </div>
  @endif
  <div class="card">
    <div class="card-header text-center font-weight-bold">
      カテゴリ登録フォーム
    </div>
    <div class="card-body">
      <form name="add-blog-post-form" id="add-blog-post-form" method="post" action="{{url('store-form')}}">
       @csrf
        <div class="form-group">
          <label for="exampleInputEmail1">カテゴリ名</label>
          <input type="text" id="name" name="name" class="form-control" required="">
        </div>
        <button type="submit" class="btn btn-primary">登録</button>
      </form>
    </div>
  </div>
</div>    
</body>
</html>

ルーティングの設定

<?php

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\CategoryController;

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/

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

Route::get('/add-category-form', [CategoryController::class, 'index']);
Route::post('/store-form', [CategoryController::class, 'store']);

実際の画面

f:id:PX-WING:20201009233125p:plain

EC2にdocker/docker-composeをインストールする

はじめに

  • EC2にDockerをインストールする。下記のサイトの手順通りに進めるとインストールできる。 docs.aws.amazon.com

  • docker-composeのインストールは下記のサイトの手順通りに進める docs.docker.jp

EC2にDockerにインストールする

  • インスタンスでインストールされているパッケージとパッケージキャッシュを更新する。
sudo yum update -y
  • 最新の Docker Community Edition パッケージをインストールする。
sudo amazon-linux-extras install docker
  • Dockerサービスを開始させる
sudo service docker start
  • ec2-user を docker グループに追加すると、sudo を使用せずに Docker コマンドを実行できます。
sudo usermod -a -G docker ec2-user

‐ ログアウトし、再びログインして、新しい docker グループアクセス権限を取得します。ec2-user が sudo を使用せずに Docker コマンドを実行できることを確認します。

$ docker info
Client:
 Debug Mode: false

Server:
 Containers: 0
  Running: 0
  Paused: 0
  Stopped: 0
 Images: 0

docker-composeインストール

  • Docker Compose 最新版をダウンロード
sudo curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
  • バイナリに対して実行権限を付与
sudo chmod +x /usr/local/bin/docker-compose
  • 実行できるか下記のコマンドで確認する
$ docker-compose  version
docker-compose version 1.16.1, build 6d1ac21
docker-py version: 2.5.1
CPython version: 2.7.13
OpenSSL version: OpenSSL 1.0.1t  3 May 2016

Laravel リレーション設定

はじめに

コード

  • Articleモデルの場合
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Article extends Model
{
    use HasFactory;

    public function article_categories()
    {
        return $this->hasMany('App\Models\ArticleCategory');
    }

    public function user()
    {
        print "test";
        return $this->belongsTo('App\Models\User', 'foreign_key');
    }     
}
  • Articleモデルの場合
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Article extends Model
{
    use HasFactory;

    public function article_categories()
    {
        return $this->hasMany('App\Models\ArticleCategory');
    }

    public function user()
    {
        print "test";
        return $this->belongsTo('App\Models\User', 'foreign_key');
    }     
}
  • ArticleCategory モデルの場合
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class ArticleCategory extends Model
{
    use HasFactory;
    public function category()
    {
        return $this->belongsTo('App\Models\Category', 'foreign_key', 'category_id');
    }

    public function article()
    {
        return $this->belongsTo('App\Models\Article', 'foreign_key');
    }       
}
  • Categoryの場合
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Category extends Model
{
    use HasFactory;

    public function article_categories()
    {
        return $this->hasMany('App\Models\ArticleCategory');
    }    
}

確認

  • tinkerで確認するとリレーションしてデータが取得できている事は確認できるが、全部のパターンで検証できていないので上記の設定にミスがあったら、ご指摘ください
>>> $articles = App\Models\User::find(1)->articles[0]->article_categories[0]
=> App\Models\ArticleCategory {#4357
     id: 2,
     category_id: 1,
     article_id: 3,
     created_at: "2020-10-08 08:48:35",
     updated_at: "2020-10-08 08:48:35",
   }

LaravelAdminでCRUDをする

はじめに

モデルを作成する

php artisan make:migration create_categories_table
  • モデルの定義を記述する。
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateCategoriesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('categories', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('categories');
    }
}
  • テーブルの作成
php artisan migrate
php artisan make:model Category

Laravel adminのコントローラーを作成する

  • モデルを作成するときに作成したモデルを指定する
$ php artisan admin:make UserController --model=App\Models\User
  • Modelが見つからないと怒られる
Model does not exists !
  • 正しい指定は下記のように「\」区切りでパスを指定すると作成に成功する
$ php artisan admin:make UserController --model=App\\Models\\User
App\Admin\Controllers\UserController created successfully.

Laravel-adminへのルーティング

  • app/Admin/routes.phpファイルにルーティングを設定する
$router->resource('/category', CategoryController::class);

動作確認

f:id:PX-WING:20201007090316p:plain

Laravel-adminをインストールする

Laravelインストール

  • Laravelプロジェクトの作成
laravel new <プロジェクト名>
cd <プロジェクト名のフォルダへ移動>
  • プロジェクトで利用する下記のパッケージをインストール
composer require doctrine/dbal
composer require encore/laravel-admin

※Doctrine DBALライブラリーは現在のカラムの状態を決め、必要な調整を行うSQLクエリを生成するために、使用しています。

  • storageフォルダに書き込み権限など付与する
$ chmod 777 -Rf storage/

タイムゾーン / 言語設定

config/app.php
@@ -67,7 +67,7 @@ return [
     |
     */

-    'timezone' => 'UTC',
+    'timezone' => 'Asia/Tokyo',

     /*
     |--------------------------------------------------------------------------
@@ -80,7 +80,7 @@ return [
     |
     */

-    'locale' => 'en',
+    'locale' => 'ja',

     /*
     |--------------------------------------------------------------------------

データベースの設定

  • .envファイルの下記の設定をおこなう
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=winlogic
DB_USERNAME=root
DB_PASSWORD=

Laravel-adminの設定

  • 次のコマンドを実行して、アセットと構成を公開します。
php artisan vendor:publish --provider="Encore\Admin\AdminServiceProvider"
  • 次のコマンドを実行して、アセットと構成を公開します。
php artisan vendor:publish --provider="Encore\Admin\AdminServiceProvider"
  • 次のコマンドを実行してインストールを完了します。
php artisan admin:install

Laravel-admin

f:id:PX-WING:20201006085101p:plain

<利用するパッケージ>

www.doctrine-project.org

laravel-admin.org

Lambdaについて

Lambdaのメリット

コストが削減できる

実行時間に対する課金形態である。

高負荷に耐えられる

必要に応じてスケーリングすることも可能である

保守・運用に手間がかからない

OSやフレームワークなどの保守を必要としない

Lambdaの制限

前回のデータは保存されない

Lambdaの実行がおわったときに環境が破棄される、ステートレスな実行環境のもとで実行される

最大5稼働時間は5分間

最大稼働時間の設定をする必要がある。その時間を超過すると自動的に終了する。 設定できる最大の稼働時間は5分である。

イベントドリブン型のプログラム

イベントの発生によって、実行が開始される。例えば「S3にファイルがアップロードされた」。 APIGatewayのサービスと組み合わせてHTMLフォームやAjax通信などによるリクエストを処理することが可能である。

小さな関数を組み合わせて全体を作る

小さな関数をたくさん組み合わせてシステムを開発することができる。 キューイングサービスであるSQSやSNSを使うと関数同士を疎結合できる拡張性に優れたシステムを構築できる

Lambda関数の構造と設計

  • 規定の書式に従った関数として記述しないといけない。
  • 関数を作るときは関数のコードだけでなく、割り当てるメモリや最大実行可能な時間などの実行環境も設定する
  • テストイベントを作成してLambda関数を手動で実行できる。Lambda関数が実行されるとClodWatchLogsに書き込まれる。

参考文献

docs.aws.amazon.com

docs.aws.amazon.com

Laravelでモデルを作成して動作確認する

はじめに

モデル

  • Eloquent(エロクエント)とはデータベースとモデルを対応づける機能。
  • ORM/ORマッパー(Object-Relational Mapping)である

モデルファイルの作成

php artisan make:model Category
php artisan make:model Article
php artisan make:model ArticleCategory

tinkerでモデルが動作するか確認する

$ php artisan tinker
Psy Shell v0.10.4 (PHP 7.4.9 — cli) by Justin Hileman
>>> $category = new App\Models\Category;
=> App\Models\Category {#3319}
>>> $category->name = "PHP";
=> "PHP"
>>> $category->save();
=> true
>>> App\Models\Category::all();
=> Illuminate\Database\Eloquent\Collection {#4042
     all: [
       App\Models\Category {#4041
         id: 1,
         name: "PHP",
         created_at: "2020-10-02 23:26:34",
         updated_at: "2020-10-02 23:26:34",
       },
     ],
   }