20201011のlaravelに関する記事は18件です。

Laravel Task Schedulerで動的にタスクを実行する

Laravelには標準でタスクスケジューラーがあるため指定した時刻に、指定した処理を実行したい場合にはかなり簡単にかける。

Kernel.php
<?php

namespace App\Console;

use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;

class Kernel extends ConsoleKernel
{
    /**
     * The Artisan commands provided by your application.
     *
     * @var array
     */
    protected $commands = [
        //
    ];

    /**
     * Define the application's command schedule.
     *
     * @param \Illuminate\Console\Scheduling\Schedule $schedule
     * @return void
     */
    protected function schedule(Schedule $schedule)
    {
        //ここにコマンドを呼び足す処理と、時刻の指定その他条件を書くだけ 
        $schedule->command('backup:clean')->dailyAt('3:00')->environments('production')->onOneServer();
    }

    /**
     * Register the commands for the application.
     *
     * @return void
     */
    protected function commands()
    {
        $this->load(__DIR__ . '/Commands');

        require base_path('routes/console.php');
    }
}

基本的にはコマンドを作成したりして、毎分実行されるscheduleメソッドの中に追記していけばいいが、困るのはDBなどから設定をとってきてそれらの時刻設定などをもとに実行する処理がある場合。この場合においてもLaravelであればかなり簡単にかける。

Model

単純にcron書式の文字列だけ持つモデルをサンプルとして作成(ie, ['id' => 1, 'cron' => '* * * * *'])

Scheduler.php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Scheduler extends Model
{
    protected $fillable = ['cron'];
}

Command

動的に設定された時刻に実行するテスト用のコマンドを生成、単純にログを書き込むだけ。

sample.php
<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Illuminate\Support\Facades\Log;

class Sample extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'log:test';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Command description';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
       Log::info('scheduler called');
    }
}

動的スケジュール

Kernel.phpにDBからとってきた値に基づいて、コマンドを呼び出すように処理を追記。

Kernel.php
<?php

namespace App\Console;

use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;

class Kernel extends ConsoleKernel
{
    /**
     * The Artisan commands provided by your application.
     *
     * @var array
     */
    protected $commands = [
        //
    ];

    /**
     * Define the application's command schedule.
     *
     * @param \Illuminate\Console\Scheduling\Schedule $schedule
     * @return void
     */
    protected function schedule(Schedule $schedule)
    {
        //DBから取得
        $schedulers = Scheduler::all();
        foreach($schedulers as $scheduler) {
          //普通にコマンドを呼び出すが、時刻設定の部分にcronを使用して、取得したcron書式の文字列を渡す。
          $schedule->command('log:test')->cron($scheduler->cron);
        }
    }

    /**
     * Register the commands for the application.
     *
     * @return void
     */
    protected function commands()
    {
        $this->load(__DIR__ . '/Commands');

        require base_path('routes/console.php');
    }
}

こんな感じでログ取れていればOK

storage/logs/laravel-2020-10-10.log
[2020-10-11 23:33:14] development.INFO: scheduler called  

まとめ

今回は、汎用性が高そうだったので、時刻指定の部分にcronを使用したが、用件に合わせてdailyAtなどの文字列を渡してもいい。
DBからスケジュールの情報を持ってきてコマンドを呼び出すという処理をschedulerメソッドの中に書いているため、呼び出しメソッドが増えていくと、可読性が下がるし、重くなる。どんな方法でハンドリングしていくのがいいかまでは試せていないので悪しからず。

結構動的に処理しなければいけないものが多かったり、重複実行してしまうのがまずかったりする場合にはwithoutOverlappingを使用したり、本番のみ実行させたい時にはenvironments、単一サーバー上で実行したい場合にはonOneServerなどをチェーンして書くことも可能。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravelルーティングから起動まで

【概要】

1.プロジェクトの作成

2.ルーティング

3.起動方法

1.プロジェクトの作成

$ composer create-project laravel/laravel 名前 --prefer-dist

名前に作成したいファイル名を記載するとその名前でファイルが生成されます。任意のファイルの中にで作成してください。

2.ルーティング

routes/web.php
<?php
Route::get('/' , function(){
   return view('****');
});

1.で作成した際にテンプレートで上記は記載されています。'/'はhttp://localhost:8000/へアクセスするようになっており、"welcom"はviews/welcome.blade.phpのプログラムが反映されます。3.で起動した際にLaravelが出てきます。

公式ではなく直にちゃんとルーティングが反映されているかを確認する方法としてweb.phpに直接viewを反映する方法があります。

routes/web.php
Route::get('hoge' , function(){
  return '<html><body>HOGE<p>HELLO,HOGE
          </body></html>';

上記のようにコーディングすると、
http://localhost:8000/HOGEにアクセスした際に、
”HOGE”と”HELLO,HOGE”が記載されているページを表示できます。

3.起動方法

$ php artisan serve

これで起動ができます。
phpの場合は何も設定していなければ、"localhost:8000"でブラウザに表示できます。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PHPバージョンアップ時にphp7compatibilityを使ってコード互換性を確認する

PHPバージョンアップ時にphp7compatibilityを使うと互換性を簡単にチェックする事ができます。
php7compatibilityを使う時、環境セットアップに多少準備が必要になるのですが、docker環境なら、すでに作成済みのdockerイメージが公開されているので、だいぶお手軽に環境を構築して確認する事ができます。

例えば以下はPHP7.1に対しての互換性を確認する際のコマンド例。
--ignore=vendorでvender配下をチェックから除外する事が出来ます。

docker run --rm -v $(pwd):/app vfac/php7compatibility 7.1 --extensions=php --ignore=vendor .

参考

vfalies/php7compatibility

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

form送れない時はパスを見よう

ルートをresourceで指定し、いざ実行!してみてもformの内容が送信されない。

web.php
Route::resource("posts",PostController::class);
edit.blade.php
            <form action="./" method="post">
                @csrf
                <p>タイトル</p>
                <p><input size="30" type="text" name="title"></p>
                <p>コンテンツ</p>
                <p><input size="70" type="text" name="content"></p>
                <p><input type="submit"></p>
            </form>

resource通りのパスに書き換えて完了

書き換え忘れに注意ですね!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

パスの変更忘れに注意します

ルートをresourceで指定し、いざ実行!してみてもformの内容が送信されなかった。
原因はresource通りのパスに書き換えるのを忘れていたからということで
resource通りのパスに書き換えて完了。

まだこういうことがちょくちょくあるのでなくしたい

web.php
Route::resource("posts",PostController::class);
edit.blade.php
            //posts/createと指定していた
            <form action="./" method="post">
                @csrf
                <p>タイトル</p>
                <p><input size="30" type="text" name="title"></p>
                <p>コンテンツ</p>
                <p><input size="70" type="text" name="content"></p>
                <p><input type="submit"></p>
            </form>
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWSにdockerを使用したlaravelをデプロイ④

概要

・自分が詰まったポイントと同じポイントで詰まった方向けにAWSにlaravel/dockerをデプロイするまでの過程を書いていきます。

EC2インスタンス内にGitをクローン

Gitのリモートレポジトリにある任意のlaravelプロジェクトをEC2インスタンス内にクローンします。

root@ip:/home/ubuntu# git clone [任意のレポジトリURL]

Dockerコンテナの立ち上げ

cloneした自分のフォルダ(docker-compose.ymlのある)へ移動し、コンテナを立ち上げます。

root@ip:/home/ubuntu/awstest# docker-compose up -d
root@ip:/home/ubuntu/awstest# docker-compose ps
    Name                   Command               State           Ports        
------------------------------------------------------------------------------
awstest_app_1   docker-php-entrypoint php-fpm    Up      9000/tcp             
awstest_db_1    docker-entrypoint.sh mysqld      Up      3306/tcp, 33060/tcp  
awstest_web_1   /docker-entrypoint.sh ngin ...   Up      0.0.0.0:10080->80/tcp

この様に立ち上がればOKです。

苦戦した箇所
docker-compose.ymlのバージョンエラーが出てエラー内容通り

root@ip-172-31-35-36:/home/ubuntu/awstest# vi docker-compose.yml
version: "3.3" ←3.8から3.3に変更

とversionを変更しました。
さらにgitへのpushが間違っていた為docker関連のファイルが無く立ち上がりませんでした。
こんなミスするヤツ自分以外いないと思いますが万が一同じ人がいたらファイルの確認をしてみて下さい。

Laravel環境設定

Laravelが使えるように環境設定をしていきます。
appコンテナに入ります。

root@ip:/home/ubuntu/awstest# docker-compose exec app bash

Laravelプロジェクト内の環境設定を行う.envファイルは.gitignoreにて指定されているため、Gitリポジトリにプッシュされません。
なので再度作成します。

root@:/work# cp .env.example .env

.envを作成したらcomposer install、そしてAPP_KEYも発行します。

root@:/work# composer install

root@:/work# php artisan key:generate

プロジェクト内の権限変更

プロジェクト内のファイルに対する権限を変更します。

通常では storage/logs と vendor の権限を変更すればOKみたいです。

ここでもエラーが起き少し苦戦しました。

file_put_contentsエラーでViewが開かない

root@:/work# chmod 777 storage/logs vendor
root@:/work# chmod 777 storage/framework/views
root@:/work# chmod 777 storage/framework/sessions

ここまでやってようやくTOPページが開ました。

http://[設定したElastic IPアドレス]:10080にブラウザからアクセスします。

スクリーンショット 2020-10-11 13.54.08.png

この様に表示されればOKです。

前回の記事
AWSにdockerを使用したlaravelをデプロイ③

**間違い等ございましたらご指摘お願い致します**

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWSにEC2上にdockerを使用したlaravelをデプロイ④

概要

・自分が詰まったポイントと同じポイントで詰まった方向けにAWSにlaravel/dockerをデプロイするまでの過程を書いていきます。

EC2インスタンス内にGitをクローン

Gitのリモートレポジトリにある任意のlaravelプロジェクトをEC2インスタンス内にクローンします。

root@ip:/home/ubuntu# git clone [任意のレポジトリURL]

Dockerコンテナの立ち上げ

cloneした自分のフォルダ(docker-compose.ymlのある)へ移動し、コンテナを立ち上げます。

root@ip:/home/ubuntu/awstest# docker-compose up -d
root@ip:/home/ubuntu/awstest# docker-compose ps
    Name                   Command               State           Ports        
------------------------------------------------------------------------------
awstest_app_1   docker-php-entrypoint php-fpm    Up      9000/tcp             
awstest_db_1    docker-entrypoint.sh mysqld      Up      3306/tcp, 33060/tcp  
awstest_web_1   /docker-entrypoint.sh ngin ...   Up      0.0.0.0:10080->80/tcp

この様に立ち上がればOKです。

苦戦した箇所
docker-compose.ymlのバージョンエラーが出てエラー内容通り

root@ip-172-31-35-36:/home/ubuntu/awstest# vi docker-compose.yml
version: "3.3" ←3.8から3.3に変更

とversionを変更しました。
さらにgitへのpushが間違っていた為docker関連のファイルが無く立ち上がりませんでした。
こんなミスするヤツ自分以外いないと思いますが万が一同じ人がいたらファイルの確認をしてみて下さい。

Laravel環境設定

Laravelが使えるように環境設定をしていきます。
appコンテナに入ります。

root@ip:/home/ubuntu/awstest# docker-compose exec app bash

Laravelプロジェクト内の環境設定を行う.envファイルは.gitignoreにて指定されているため、Gitリポジトリにプッシュされません。
なので再度作成します。

root@:/work# cp .env.example .env

.envを作成したらcomposer install、そしてAPP_KEYも発行します。

root@:/work# composer install

root@:/work# php artisan key:generate

プロジェクト内の権限変更

プロジェクト内のファイルに対する権限を変更します。

通常では storage/logs と vendor の権限を変更すればOKみたいです。

ここでもエラーが起き少し苦戦しました。

file_put_contentsエラーでViewが開かない

root@:/work# chmod 777 storage/logs vendor
root@:/work# chmod 777 storage/framework/views
root@:/work# chmod 777 storage/framework/sessions

ここまでやってようやくTOPページが開ました。

http://[設定したElastic IPアドレス]:10080にブラウザからアクセスします。

スクリーンショット 2020-10-11 13.54.08.png

この様に表示されればOKです。

マイグレーションを実行する

root@:/work# php artisan migrate
root@:/work# php aritsan db:seed

ここまでやればローカルで作成したアプリが動くと思います。

以上で「AWSにEC2上にdockerを使用したlaravelをデプロイ」を終了させていただきます。
ありがとうございました。

前回の記事
AWSにEC2上にdockerを使用したlaravelをデプロイ③

**間違い等ございましたらご指摘お願い致します**

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWSにEC2上にdockerを使用したlaravelをデプロイ④(gitクローン〜デプロイ、マイグレーション)

概要

・自分が詰まったポイントと同じポイントで詰まった方向けにAWSにlaravel/dockerをデプロイするまでの過程を書いていきます。

EC2インスタンス内にGitをクローン

Gitのリモートレポジトリにある任意のlaravelプロジェクトをEC2インスタンス内にクローンします。

root@ip:/home/ubuntu# git clone [任意のレポジトリURL]

Dockerコンテナの立ち上げ

cloneした自分のフォルダ(docker-compose.ymlのある)へ移動し、コンテナを立ち上げます。

root@ip:/home/ubuntu/awstest# docker-compose up -d
root@ip:/home/ubuntu/awstest# docker-compose ps
    Name                   Command               State           Ports        
------------------------------------------------------------------------------
awstest_app_1   docker-php-entrypoint php-fpm    Up      9000/tcp             
awstest_db_1    docker-entrypoint.sh mysqld      Up      3306/tcp, 33060/tcp  
awstest_web_1   /docker-entrypoint.sh ngin ...   Up      0.0.0.0:10080->80/tcp

この様に立ち上がればOKです。

苦戦した箇所
docker-compose.ymlのバージョンエラーが出てエラー内容通り

root@ip-172-31-35-36:/home/ubuntu/awstest# vi docker-compose.yml
version: "3.3" ←3.8から3.3に変更

とversionを変更しました。
さらにgitへのpushが間違っていた為docker関連のファイルが無く立ち上がりませんでした。
こんなミスするヤツ自分以外いないと思いますが万が一同じ人がいたらファイルの確認をしてみて下さい。

Laravel環境設定

Laravelが使えるように環境設定をしていきます。
appコンテナに入ります。

root@ip:/home/ubuntu/awstest# docker-compose exec app bash

Laravelプロジェクト内の環境設定を行う.envファイルは.gitignoreにて指定されているため、Gitリポジトリにプッシュされません。
なので再度作成します。

root@:/work# cp .env.example .env

.envを作成したらcomposer install、そしてAPP_KEYも発行します。

root@:/work# composer install

root@:/work# php artisan key:generate

プロジェクト内の権限変更

プロジェクト内のファイルに対する権限を変更します。

通常では storage/logs と vendor の権限を変更すればOKみたいです。

ここでもエラーが起き少し苦戦しました。

file_put_contentsエラーでViewが開かない

root@:/work# chmod 777 storage/logs vendor
root@:/work# chmod 777 storage/framework/views
root@:/work# chmod 777 storage/framework/sessions

ここまでやってようやくTOPページが開ました。

http://[設定したElastic IPアドレス]:10080にブラウザからアクセスします。

スクリーンショット 2020-10-11 13.54.08.png

この様に表示されればOKです。

マイグレーションを実行する

root@:/work# php artisan migrate
root@:/work# php aritsan db:seed

ここまでやればローカルで作成したアプリが動くと思います。

以上で「AWSにEC2上にdockerを使用したlaravelをデプロイ」を終了させていただきます。
ありがとうございました。

前回の記事
AWSにEC2上にdockerを使用したlaravelをデプロイ③

**間違い等ございましたらご指摘お願い致します**

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWSにdockerを使用したlaravelをデプロイ③

概要

・自分が詰まったポイントと同じポイントで詰まった方向けにAWSにlaravel/dockerをデプロイするまでの過程を書いていきます。

前回の記事
AWSにdockerを使用したlaravelをデプロイ②

EC2インスタンスにSSHでアクセスする

1:EC2ダッシュボード作成したインスタンスに入りの右上の「接続」をクリック
スクリーンショット 2020-10-10 22.11.55.png

2:インスタンスに接続コード確認
「SSH クライアント」をクリック
スクリーンショット 2020-10-10 22.12.06.png

3:EC2インスタンスにSSHでアクセス
ターミナルを起動し

chmod 400 test-docker.pem
ssh -i "test-docker.pem" ubuntu@ec2-52-198-43-4.ap-northeast1.compute.amazonaws.com

test-docker.pemの部分はダウンロードし格納したディレクトリを指定して下さい。

Gitのインストール

EC2内への変更にはスーパーユーザーで行わないといけないので「sudo」を打つか

ubuntu@ip:~$ sudo su
root@ip:/home/ubuntu# 

行頭にある「$(ドル)」が一般ユーザーを表し、「#(シャープ)」がrootユーザーを表します。

1:aptの更新

root@ip:/home/ubuntu# apt-get update

2:Gitのインストール
Gitのインストールと初期設定を行います。

#gitインストール
root@ip:/home/ubuntu# apt-get install git

#git初期設定
root@ip:/home/ubuntu# git config --global user.name [任意のユーザー名]
root@ip:/home/ubuntu# git config --global user.email [任意のemailアドレス]

Docker,Docker-composeのインストール

ubuntu用の手順をDocker公式ページに従います。
Docker,Docker-composeのインストールを行います。

root@ip:/home/ubuntu# apt-get install \apt-transport-https \ca-certificates \curl \gnupg-agent \software-properties-common

root@ip:/home/ubuntu# curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

root@ip:/home/ubuntu# apt-key fingerprint 0EBFCD88

root@ip:/home/ubuntu# add-apt-repository \
                      "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
                      $(lsb_release -cs) \
                      stable"

root@ip:/home/ubuntu# apt-get install docker-ce docker-ce-cli containerd.io

#docker-composeのインストール
root@ip:/home/ubuntu# apt install docker-compose

前回の記事
AWSにdockerを使用したlaravelをデプロイ②

続きはこちら

**間違い等ございましたらご指摘お願い致します**

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWSにEC2上にdockerを使用したlaravelをデプロイ③

概要

・自分が詰まったポイントと同じポイントで詰まった方向けにAWSにlaravel/dockerをデプロイするまでの過程を書いていきます。

前回の記事
AWSにdockerを使用したlaravelをデプロイ②

EC2インスタンスにSSHでアクセスする

1:EC2ダッシュボード作成したインスタンスに入りの右上の「接続」をクリック
スクリーンショット 2020-10-10 22.11.55.png

2:インスタンスに接続コード確認
「SSH クライアント」をクリック
スクリーンショット 2020-10-10 22.12.06.png

3:EC2インスタンスにSSHでアクセス
ターミナルを起動し

chmod 400 test-docker.pem
ssh -i "test-docker.pem" ubuntu@ec2-52-198-43-4.ap-northeast1.compute.amazonaws.com

test-docker.pemの部分はダウンロードし格納したディレクトリを指定して下さい。

Gitのインストール

EC2内への変更にはスーパーユーザーで行わないといけないので「sudo」を打つか

ubuntu@ip:~$ sudo su
root@ip:/home/ubuntu# 

行頭にある「$(ドル)」が一般ユーザーを表し、「#(シャープ)」がrootユーザーを表します。

1:aptの更新

root@ip:/home/ubuntu# apt-get update

2:Gitのインストール
Gitのインストールと初期設定を行います。

#gitインストール
root@ip:/home/ubuntu# apt-get install git

#git初期設定
root@ip:/home/ubuntu# git config --global user.name [任意のユーザー名]
root@ip:/home/ubuntu# git config --global user.email [任意のemailアドレス]

Docker,Docker-composeのインストール

ubuntu用の手順をDocker公式ページに従います。
Docker,Docker-composeのインストールを行います。

root@ip:/home/ubuntu# apt-get install \apt-transport-https \ca-certificates \curl \gnupg-agent \software-properties-common

root@ip:/home/ubuntu# curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

root@ip:/home/ubuntu# apt-key fingerprint 0EBFCD88

root@ip:/home/ubuntu# add-apt-repository \
                      "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
                      $(lsb_release -cs) \
                      stable"

root@ip:/home/ubuntu# apt-get install docker-ce docker-ce-cli containerd.io

#docker-composeのインストール
root@ip:/home/ubuntu# apt install docker-compose

前回の記事
AWSにEC2上にdockerを使用したlaravelをデプロイ②

続きはこちら
AWSにdockerを使用したlaravelをデプロイ④

**間違い等ございましたらご指摘お願い致します**

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWSにEC2上にdockerを使用したlaravelをデプロイ③(SSH接続〜Docke-composeインストール)

概要

・自分が詰まったポイントと同じポイントで詰まった方向けにAWSにlaravel/dockerをデプロイするまでの過程を書いていきます。

前回の記事
AWSにdockerを使用したlaravelをデプロイ②

EC2インスタンスにSSHでアクセスする

1:EC2ダッシュボード作成したインスタンスに入りの右上の「接続」をクリック
スクリーンショット 2020-10-10 22.11.55.png

2:インスタンスに接続コード確認
「SSH クライアント」をクリック
スクリーンショット 2020-10-10 22.12.06.png

3:EC2インスタンスにSSHでアクセス
ターミナルを起動し

chmod 400 test-docker.pem
ssh -i "test-docker.pem" ubuntu@ec2-52-198-43-4.ap-northeast1.compute.amazonaws.com

test-docker.pemの部分はダウンロードし格納したディレクトリを指定して下さい。

Gitのインストール

EC2内への変更にはスーパーユーザーで行わないといけないので「sudo」を打つか

ubuntu@ip:~$ sudo su
root@ip:/home/ubuntu# 

行頭にある「$(ドル)」が一般ユーザーを表し、「#(シャープ)」がrootユーザーを表します。

1:aptの更新

root@ip:/home/ubuntu# apt-get update

2:Gitのインストール
Gitのインストールと初期設定を行います。

#gitインストール
root@ip:/home/ubuntu# apt-get install git

#git初期設定
root@ip:/home/ubuntu# git config --global user.name [任意のユーザー名]
root@ip:/home/ubuntu# git config --global user.email [任意のemailアドレス]

Docker,Docker-composeのインストール

ubuntu用の手順をDocker公式ページに従います。
Docker,Docker-composeのインストールを行います。

root@ip:/home/ubuntu# apt-get install \apt-transport-https \ca-certificates \curl \gnupg-agent \software-properties-common

root@ip:/home/ubuntu# curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

root@ip:/home/ubuntu# apt-key fingerprint 0EBFCD88

root@ip:/home/ubuntu# add-apt-repository \
                      "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
                      $(lsb_release -cs) \
                      stable"

root@ip:/home/ubuntu# apt-get install docker-ce docker-ce-cli containerd.io

#docker-composeのインストール
root@ip:/home/ubuntu# apt install docker-compose

前回の記事
AWSにEC2上にdockerを使用したlaravelをデプロイ②

続きはこちら
AWSにdockerを使用したlaravelをデプロイ④

**間違い等ございましたらご指摘お願い致します**

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWSにEC2上でdockerを使用したlaravelをデプロイ②

概要

・自分が詰まったポイントと同じポイントで詰まった方向けにAWSにlaravel/dockerをデプロイするまでの過程を書いていきます。

前回の記事
AWSにdockerを使用したlaravelをデプロイ①

Elastic IP取得

1:Elastic IPを開く
EC2ダッシュボードの左側のメニューの「Elastic IP」を選択。
「Elastic IPの割り当て」をクリック。
スクリーンショット 2020-10-10 22.05.30.png

2:「割り当て」をクリック
スクリーンショット 2020-10-10 22.05.36.png

3:割り当てられたIPをクリック
スクリーンショット 2020-10-10 22.06.02.png

4:EC2インスタンスに紐づける
「Elastic IP アドレスの関連付け」をクリック
スクリーンショット 2020-10-11 11.45.56.png

5:インスタンスを選択
「インスタンス」に先ほど作成したEC2インスタンスを選択する。
「関連付ける」をクリック。
スクリーンショット 2020-10-10 22.06.30.png

これで作成したインスタンスにElastic IPが紐付けられました。

前回の記事
AWSにEC2上にdockerを使用したlaravelをデプロイ①

続きはこちら
AWSにEC2上にdockerを使用したlaravelをデプロイ③

**間違い等ございましたらご指摘お願い致します**

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWSにEC2上でdockerを使用したlaravelをデプロイ②(Elastic IP取得〜紐付け)

概要

・自分が詰まったポイントと同じポイントで詰まった方向けにAWSにlaravel/dockerをデプロイするまでの過程を書いていきます。

前回の記事
AWSにdockerを使用したlaravelをデプロイ①

Elastic IP取得

1:Elastic IPを開く
EC2ダッシュボードの左側のメニューの「Elastic IP」を選択。
「Elastic IPの割り当て」をクリック。
スクリーンショット 2020-10-10 22.05.30.png

2:「割り当て」をクリック
スクリーンショット 2020-10-10 22.05.36.png

3:割り当てられたIPをクリック
スクリーンショット 2020-10-10 22.06.02.png

4:EC2インスタンスに紐づける
「Elastic IP アドレスの関連付け」をクリック
スクリーンショット 2020-10-11 11.45.56.png

5:インスタンスを選択
「インスタンス」に先ほど作成したEC2インスタンスを選択する。
「関連付ける」をクリック。
スクリーンショット 2020-10-10 22.06.30.png

これで作成したインスタンスにElastic IPが紐付けられました。

前回の記事
AWSにEC2上にdockerを使用したlaravelをデプロイ①

続きはこちら
AWSにEC2上にdockerを使用したlaravelをデプロイ③

**間違い等ございましたらご指摘お願い致します**

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWSにdockerを使用したlaravelをデプロイ②

概要

・自分が詰まったポイントと同じポイントで詰まった方向けにAWSにlaravel/dockerをデプロイするまでの過程を書いていきます。

前回の記事
AWSにdockerを使用したlaravelをデプロイ①

Elastic IP取得

1:Elastic IPを開く
EC2ダッシュボードの左側のメニューの「Elastic IP」を選択。
「Elastic IPの割り当て」をクリック。
スクリーンショット 2020-10-10 22.05.30.png

2:「割り当て」をクリック
スクリーンショット 2020-10-10 22.05.36.png

3:割り当てられたIPをクリック
スクリーンショット 2020-10-10 22.06.02.png

4:EC2インスタンスに紐づける
「Elastic IP アドレスの関連付け」をクリック
スクリーンショット 2020-10-11 11.45.56.png

5:インスタンスを選択
「インスタンス」に先ほど作成したEC2インスタンスを選択する。
「関連付ける」をクリック。
スクリーンショット 2020-10-10 22.06.30.png

これで作成したインスタンスにElastic IPが紐付けられました。

前回の記事
AWSにdockerを使用したlaravelをデプロイ①

続きはこちら
AWSにdockerを使用したlaravelをデプロイ③

**間違い等ございましたらご指摘お願い致します**

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravelで画像をリサイズ&勝手に回転しないようにする(EXIFも削除)

はじめに

Laravelで画像投稿機能を作ったは良いけど、

 「投稿される画像が大きかったり小さかったりする..」
 「アップロード後に画像が勝手に回転してしまう..」
 「画像に埋め込まれた隠し情報が危険って聞いたけど..」

そんな問題を解消していきます。

画像の大きさの問題はCSSで指定すれば表示は小さくできますが、
CSSは表示を変えるだけで保存される画像は大きいままです。
これではデータベース周りに負荷がかかってしまいます。

また画像にはEXIF情報というものが埋め込まれていて、撮影したスマートフォンの情報だったり画像の向き、さらには撮影した場所などが記録されているものもあります。

これらを簡単に同時に最適化する方法をシェアしていきます。

やること

以下の手順で行います。
 ① 現状のEXIF情報をみてみる
 ② InterventionImageをインストールする(Composerを使用)
 ③ InterventionImageを使えるようにする(Configの設定をする)
 ④ Controllerで実際に画像処理を行う

実際にやってみる

① まず現状の画像のEXIF情報をみてみる

現在画像処理を行っているControllerにおいてdd()メソッドを実行します。
(ちなみにdd()は「dump and die」の略なんですね)

〇〇Controller.php
dd($image->exif()); // $imageが画像データです

これでブラウザにEXIF情報が表示できます。
ずらっと配列で表示されて、撮影した機種など色々な情報が格納されているのがわかると思います。。

② InterventionImageをインストールする

この余計なEXIFの削除とリサイズ処理と回転(画像の向き)の最適化処理を同時に簡単にできるのがInterventionImageというものです。
PHPの画像処理ライブラリであるGDとImagickをサポートするパッケージで、
Laravelで画像処理をするならこれ一択、という位置付けのものですね。
GDやImagickを簡単に扱うことができます。

公式はこちら
http://image.intervention.io/getting_started/installation#laravel

以下のコマンドを実行してインストールします。

$php composer.phar require intervention/image


③ InterventionImageを使えるようにする

Config/app.phpに以下の記述を追加します。
追加するのはprovidersaliasesの2箇所です。

Config/app.php
'providers' => [
    Intervention\Image\ImageServiceProvider::class,
],

~中略~

'aliases' => [
    'Image' => Intervention\Image\Facades\Image::class,
],



さらにdriver設定の追加を行います。(以下のコマンドを実行)

$php artisan vendor:publish --provider="Intervention\Image\ImageServiceProviderLaravelRecent"



最後に、Configで設定をいじったのでキャッシュをクリアします。(以下のコマンドを実行)

$php artisan config:clear


③ Controllerで実際に処理を行う

ファサードを使う宣言をする

まずは画像処理を行うControllerにおいて以下を記述します。

〇〇Controller.php
use Intervention\Image\Facades\Image; // Imageファサードを使う
use Illuminate\Support\Facades\Storage; // Storageファサードを使う

画像処理を行う

InterventionImageでは本当に色々なことができるのですが、
ここでは実際によく使うであろう縦横比を維持したリサイズと、
ファイルをjpg形式に変換する例を示します。

〇〇Controller.php
$resized_image = Image::make($posted_image)->fit(640, 360)->encode('jpg');



$posted_imageが加工前の画像で、make()でInterventionImageに加工前の画像を読み込んでいます。
fit()は幅と高さを指定しつつ、縦横比が合わない場合はトリミングしてくれるメソッドです。

単純なリサイズならresize()でも良いのですが、画像がゆがんでしまうのでこのfit()が便利だと思います。

※InterventionImageでの網羅的な画像処理はこちらのサイトが参考になります。
https://blog.capilano-fw.com/?p=1574#_resize

画像の回転とEXIF情報の処理

最後に本題(?)の画像が勝手に回転する問題とEXIF情報の処理です。
これにはorientate()を使います。

〇〇Controller.php
$resized_image->orientate()->save();

これで自動回転しつつEXIF情報を削除してくれます。
->save()がないと処理が反映されないので注意です。

ファイル保存する

ファイル保存はstoreメソッドが使えない(GDがサポートしていないというエラーになる)ので
Laravelの機能(ファサード)のStorage::putを使います。

〇〇Controller.php
Storage::put('public/image/' . $image_name, $resized_image); 



これで良い感じの大きさになり、画像の向きも正しい向きになり、不要な埋め込み情報も削除された画像が投稿できるようになったはずです!
おつかれさまでした〜。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel ベースレイアウトにDBから取得したデータを表示する

目的

  • ベースレイアウトにテーブル内に格納されているデータを表示する方法をまとめる

実施環境

  • ハードウェア環境
項目 情報
OS macOS Catalina(10.15.5)
ハードウェア MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports)
プロセッサ 2 GHz クアッドコアIntel Core i5
メモリ 32 GB 3733 MHz LPDDR4
グラフィックス Intel Iris Plus Graphics 1536 MB
  • ソフトウェア環境
項目 情報 備考
PHP バージョン 7.4.8 Homebrewを用いてこちらの方法で導入→Mac HomebrewでPHPをインストールする
Laravel バージョン 8.6.0 commposerを用いてこちらの方法で導入→Mac Laravelの環境構築を行う
MySQLバージョン 8.0.19 for osx10.13 on x86_64 Homwbrewを用いてこちらの方法で導入→Mac HomebrewでMySQLをインストールする

前提情報

  • 本記事は@injectディレクティブの使用方法を簡単にまとめるものである。
  • @injectディレクティブはサービスやリポジトリインターフェースを呼び出す事のできるディレクティブである。
  • 本記事は若干抽象的な説明が多くわかりにくいと思うので具体例を別途記事にする予定である

詳細

  1. ベースレイアウトへのディレクティブの記載

    1. 下記の記載方法でベースレイアウトにディレクティブを記載する。

      @inject(サービスからの戻り値を格納する変数, サービス)
      
    2. 例えば変数$strアプリ名ディレクトリ/app/Services/TestServiceに記載されているとあるメソッドの戻り値を格納したい場合は下記のように記載する。

      @inject('str', 'App\Services\TestService)
      
  2. 得た値の出力

    1. ディレクティブを記載したベースレイアウトファイル内で下記のように記載する事により値を出力する事ができる。

      {{ 戻り値を格納した変数名->サービスファイルに書かれたデータ取得メソッド名()}}
      
    2. 例えば変数$strに格納されているアプリ名ディレクトリ/app/Services/TestServiceに記載されているとあるgetStr()メソッドの戻り値を表示したい場合は下記のように記載する。

      {{ $str->getStr() }}
      

参考文献

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Flutter × Laravel × Stripe で単発決済

はじめに

約半年振りの投稿です。
最近はWeb開発から少し離れFlutterの開発を行なっております。

巷で流行っている言語&AndroidとIOSの開発を同一言語でできるというのが大変魅力で学習をはじめました。

KBOYのFlutter大学
https://www.youtube.com/channel/UCReuARgZI-BFjioA8KBpjsw

自分はこのチャンネルから学習を始めました。
超丁寧に説明していただけるので、初学者に大変オススメです!

経緯

もともと決済処理はWebViewで決済処理を行う予定でした。
しかし、調べているうちに

https://digiryte.com/blog/posts/online-payments-made-easier-by-digiryte-by-flutter-and-ruby-on-rails

こちらの記事を発見しRailsでもできるならLaravelでもできるんじゃね?
と思ったのが事の発端です。

言語違いではありますが、実装例があるのに自分で実装できないのはちょっと悔しいと思い試行錯誤の末実装できました。

Stripeとは

こちらの記事が大変参考になります。
https://qiita.com/t-kuni/items/bfbec1dcc695c0f18282

Flutterで画面の作成

画面作成の前にStripeを導入するにあたって必要なパッケージを導入します。

pubspec.yaml
dependencies:
  flutter:
    sdk: flutter
...
# この辺は自分の環境にあったものを導入してください。
stripe_payment: ^1.0.6
stripe_sdk: ^3.0.1+1
main.dart
import 'package:flutter/material.dart';
import 'package:stripe_payment/stripe_payment.dart';
import 'package:stripe_sdk/stripe_sdk_ui.dart';


void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey();
  final formKey = new GlobalKey<FormState>();
  final card = new StripeCard();
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            CardForm(card: card, formKey: formKey), // クレジットカード入力欄を表示します。
            FlatButton(
              child: Text("決済する"),
              onPressed: () async {
                if (formKey.currentState.validate()) {
                  formKey.currentState.save();

                  final CreditCard _creditCard = CreditCard(
                      number: card.number,
                      expMonth: card.expMonth,
                      expYear: card.expYear,
                     );
                      StripePayment.createTokenWithCard(
                      _creditCard,
                    ).then((token) {
                      // apiに処理を渡します。              
                      final url = 'http://127.0.0.1/api/sample_stripe';
                      await http.post(
                       url,
                       body: {
                         "stripeToken": stripeToken,
                       }
                     );
                    } else {
                    print('処理が通りませんでした。');
                  }
               },
            ),
          ],
        ),
      ),
    );
  }
}

スクリーンショット 2020-10-11 4.44.06.png
上記の画像のようなページが作成されます。

処理の流れとしては下記のような流れになります。
1.CardFormクラスを作成し、クレジットカード情報を入力
2.「決済する」ボタンをタップ
3.CreditCardクラスを作成し入力した値を渡す。
4.stripeTokenを作成
5.Laravel側にstripeTokenを渡す。

作成できない場合は下記のURLを参考に作成してみてください。
https://pub.dev/packages/stripe_sdk

Laravel側でAPIの作成

api.php
Route::post('/sample_stripe', 'SampleStripeController@stripe');
SampleStripeController.php
function stirpe(Request $request)
    {
        //  Stripeシークレットキーの取得
        Stripe::setApiKey(config('app.stripe_secret_key'));
        // 顧客の作成
        $customer = Customer::create(array(
            'email' => text@example.com,
            'source' => $request->stripeToken //tokenを受け取る
        ));

        $charge = Charge::create(array(
            'description' => 'ストライプ決済',
            'amount' => 500,
            'currency' => 'jpy',
            'customer' => $customer->id,
        ));
    }

Stripe管理画面

スクリーンショット 2020-10-11 5.36.11.png
画像のように決済処理が完了しました。
Flutter側だけで処理しようとするとどうしてもわからない部分が多かったので重要な処理はLaravel側に投げて解決させました。

最初はstripeTokenが取得できずStripeの顧客にデータが登録できませんでしたが、「createTokenWithCard」を利用することで顧客データの登録ができるようになりました!

本記事では実装していませんが、決済が終了した後メールを送信してあげたりするともっといいかもしれませんね!

本システムを作成するにあたって苦戦したところ

Flutter × Laravel × Stripe の記事が存在しなかったことが苦戦しました。
APIに処理を渡すということが理解できていてもstripeTokenが取得できなかったりRailsの記事の内容をLaravelに置き換えて実装してもエラー続きでした。
理解はできていても実装できないという大変歯がゆい思いをしながら開発しました(笑)

指摘等がございましたら是非お願いします。

決済処理やAPIを利用できると実装の幅が増えると思うのでぜひ参考にしてみてください!

参考URL

https://medium.com/flutterdevs/stripe-payment-in-flutter-d7f87f9a193c
https://digiryte.com/blog/posts/online-payments-made-easier-by-digiryte-by-flutter-and-ruby-on-rails
https://pub.dev/packages/stripe_sdk

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

LaravelでReactを使う私的まとめ

Laravel Mix

  • フロントエンドのアセットをコンパイル、バンドルしてくれる
  • 中身はwebpackでwebpackの設定をわかりやすく掛けるようにラッピングしてある
  • sass,babelなどは最初から用意されている

バンドル

バンドルとは、束(ねる)、塊などの意味を持つ英単語で、単体でも提供可能な製品やサービスを、複数組み合わせてセットで販売したり、別の製品やサービスに付属して販売、提供することをこのように呼ぶ。
引用:バンドル 【 bundle 】

つまり違うものを組み合わせてくれるってことかな

Laravel Mixの実行

npm run dex

npm run dev を実行すると、
package.jsonに書いてあるスクリプトが実行され、
設定ファイルに記述したコンパイルやバンドルが実行される。

npm run production の場合は圧縮されたファイルが出力される。
引用:Laravel Mixとは?webpackをより便利に、簡単に。Laravel以外でも使えるよ。

npm run watch

関連ファイルを監視する
変更を感知すると自動的に再コンパイル

webpack.mix.jsファイル

Sass

saasメソッドはSassをCSSコンパイル

mix.sass('resources/assets/sass/app.scss', 'public/css');

ページを作ってみる

resource/js/app.js
/**
 * Next, we will create a fresh React component instance and attach it to
 * the page. Then, you may begin adding components to this application
 * or customize the JavaScript scaffolding to fit your unique needs.
 */

//require('./components/Example'); 
require('./components/index'); //ここを書き換える

次に、すべてのルーティングをindex.balde.phpに集中させる

web.php
Route::get('/{any}', function(){
    return view('index');
})->where('any', '.*'); 

bladeファイルを作成

index.blade.php
<!doctype html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head>
  <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="csrf-token" content="{{ csrf_token() }}">
  <title>Title</title>
</head>
<body>
<div id="root">
    {{-- <example-component></example-component> --}}
</div>

<script src="{{ asset('/js/app.js') }}"></script>
</body>
</html>

これでreact-router-domによるルーティングに対応できました。

参考:LaravelにReactを導入する時の手順〜ルーティングの設定

参考

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む