20200603のlaravelに関する記事は14件です。

x-serverでcronを実装する方法

 

自分が実装する際になかなか良い情報に出会えずかなり時間がかかったので備忘録も兼ねて残しておきます。
 
今回はフレームワークにlaravelを使用したCRON実装法を解説していきます。
 

まず初めにLaravelのドキュメントでは、以下のように設定すれば良いと書いています。

* * * * * php /path/to/artisan schedule:run >> /dev/null 2>&1

image.png

しかし、これをx-serverのcron設定コマンドに書いたところでなにも動きません。。。

X-serverではこのような記述はできないようです。。。

じゃあどうするのって躓いているあなたに向けて実装法について解説していきます。
 

3ステップでめちゃめちゃ簡単です。
 

1.シェルスクリプトの作成

以下のコードを書いたファイルを作成します。

sh_test.sh
#!/bin/sh
/usr/bin/php7.3/home/サーバーID/独自ドメイン名/laravel/artisan schedule:run

laravelディレクトリ直下に作成したファイルを置きます。

※phpのバージョンは環境に合わせて適宜変更してください。

拡張子が.shであればファイル名は何でもいいです。
 

2.shファイルの権限を755に変更

権限を変更しないとx-server側でCRONを実行してくれません。

以下のコマンドで権限を755に変更できます。

chmod 755 test_file 

実行できたら以下のコマンドで権限の確認ができます。

ls -l sh_test.sh

-rwxr-xr-x と表記されていたら成功です。

以下リンクに詳細が書いてあるので参考にしてみてください。

パーミッションを755に(chmod)

3.x-server側でのCRON設定

ここまでできたらあとはCRONの設定をするのみです。

image.png

設定後はアドレスを追加してみて実行結果を確認してみてください。(無料会員はメール通知機能を使えないです。)

以上がx-serverでCRONを実装する方法でした。

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

x-serverでcronを実装する方法【3ステップで簡単に】

 
自分が実装する際になかなか良い情報に出会えずかなり時間がかかったので備忘録も兼ねて残しておきます。
 
今回はフレームワークにlaravelを使用したCRON実装法を解説していきます。
 

まず初めにLaravelのドキュメントでは、以下のように設定すれば良いと書いています。

* * * * * php /path/to/artisan schedule:run >> /dev/null 2>&1

image.png

しかし、これをx-serverのcron設定コマンドに書いたところでなにも動きません。。。

X-serverではこのような記述はできないようです。。。

じゃあどうするのって躓いているあなたに向けて実装法を解説していきます。
 

3ステップでめちゃめちゃ簡単です。
 

1.シェルスクリプトの作成

以下のコードを書いたファイルを作成します。

sh_test.sh
#!/bin/sh
/usr/bin/php7.3/home/サーバーID/独自ドメイン名/laravel/artisan schedule:run

laravelディレクトリ直下に作成したファイルを置きます。

※phpのバージョンは環境に合わせて適宜変更してください。

拡張子が.shであればファイル名は何でもいいです。
 

2.shファイルの権限を755に変更

次に権限を変更しないとx-server側でCRONを実行してくれません。

以下のコマンドで権限を755に変更できます。

chmod 755 test_file 

実行できたら以下のコマンドで権限の確認ができます。

ls -l sh_test.sh

-rwxr-xr-x と表記されていたら成功です。

以下リンクに詳細が書いてあるので参考にしてみてください。

パーミッションを755に(chmod)

3.x-server側でのCRON設定

最後はCRONの設定をするのみです。

以下を参考に設定してみてください。

image.png

設定後はアドレスを追加し実行結果を確認してみてください。(無料会員はメール通知機能を使えません。)

以上がx-serverでCRONを実装する方法でした。

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

MAMPのMySQLを利用するとことで面倒な環境構築せず、すぐにMySQL使えるように設定しよう!

まず、MAMPをダウンロードします。(無料)
https://www.mamp.info/en/downloads/
MAMP&MAMP PROをクリックしてダウンロード。

ダウンロードしたら、インストールします。
インストール終了したら、アプリケーションに作成されます。
スクリーンショット 2020-06-03 19.51.15.png

MAMPアイコンをMacのDockにドラッグ&ドロップしてショートカットの作成をオススメします。
アイコンをクリックすると起動します。
スクリーンショット 2020-06-03 19.54.13.png

Start Serversをクリックすると緑色に点灯してMySQLが使えるようになります。
※Cloudは、赤く点灯しますが、無視してください。
スクリーンショット 2020-06-03 19.56.15.png

MySQLが起動すると以下のphpMyAdminリンクにアクセスできます。
http://localhost:8888/phpMyAdmin/
phpMyAdminは、データベース、テーブル、カラムの作成、変更、削除が容易にできます。

laravelの.envを設定しましょう。
デフォルトは、以下になっています。
スクリーンショット 2020-06-03 20.06.28.png

スクリーンショット 2020-06-03 20.08.45.png

DB_DATABASE= データベース名を記述。
DB_PASSWORD= Macの場合は、rootになります。
追加でDB_SOCKET=/Applications/MAMP/tmp/mysql/mysql.sockを記述。

phpMyAdminでデータベースを作成してみましょう。
新規作成をクリック。
データベース名を入力。
作成ボタンをクリックでデータベースが作成されました。
スクリーンショット 2020-06-03 20.15.07.png

作成したデータベース名を.envDB_DATABASE= に記述。
スクリーンショット 2020-06-03 20.08.45のコピー.png

ターミナルでmigrationします。

php artisan migrate

設定したデータベースにmigrationされました。

phpMyAdminにアクセスして確認。
http://localhost:8888/phpMyAdmin/
作成したデータベース以下にmigrationされています。

以上です。

参考になったら幸いです。

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

Laravel6にログイン機能を実装する

前回までに、WSL2+Docker+Laravel環境を構築した。その続き。
https://qiita.com/gochimonmon/items/e62c71fad9757c0ffcff

node, npmの最新版を導入

以下を参考に導入。各コマンドをappのDockerFileに書いておくでもOK、自分はそうした。
https://qiita.com/seibe/items/36cef7df85fe2cefa3ea

ログイン機能の実装

appのターミナルで実行。

composer require laravel/ui "^1.0" --dev
php artisan ui vue --auth

ここまで

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

Field ' ' doesn't have a default value

Laravelの画像投稿機能実装時のエラー

画像投稿機能実装中に以下のエラーが表示された

Field 'user_id' doesn't have a default value

問題点1
posts controller storeアクション

 public function store(Request $request){
    $validator = Validator::make($request->all(), [
        'file' => 'required|max:10240|mimes:jpeg,gif,png',
        'content' => 'required|max:191'
    ]);

    if($validator->fails()){
        return back()->withInput()->withErrors($validator);
    }

    $file = $request->file('file');
    $path = Storage::disk('s3')->putFile('/', $file, 'public');

    Post::create([
        'user_id' => \Auth::user()->id,
        'image_file_name' => $path,
        'content' => $request->content
    ]);

     return redirect('/');
}

'user_id' => \Auth::user()->id,の一文が抜けていた

問題点2
Post Model Post.php

class Post extends Model
{
    protected $fillable =[
        'image_file_name', 'content', 'user_id'
    ];
}

$fillableの中に 'user_id' を記入していなかったため。

以上の2点を解決後フォームから送信で無事に動作した。
マイグレーションファイルにuser_idと書いていたのに上記のファイル無いで設定していないために発生したエラーだった。

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

FileSystemでファイルクリアをすると結果が取得できなくて困ったこと

背景

特定のファイルをcleanするコードを書きたくて

$result = app('files')->put($this->pathFromInput('clean'), '');
$result_str = $result ? "success" : "failure";
\Log::info("{$this->pathFromInput('clean')} cleaned: {$result_str}.");

みたいなコードを書いていたんですけど、ファイルの中身が消されてるのに結果がFalseで返ってきてておかしいなって思いました。

調査

なのでLaravelのコードをのぞいてみました。
https://github.com/laravel/framework/blob/7.x/src/Illuminate/Filesystem/Filesystem.php#L133-L136

public function put($path, $contents, $lock = false)
{
    return file_put_contents($path, $contents, $lock ? LOCK_EX : 0);
}

なんだ単にfile_put_contentsコールしてるだけなのね。PHPの方を調べてみよう。
https://www.php.net/manual/ja/function.file-put-contents.php#refsect1-function.file-put-contents-returnvalues

この関数はファイルに書き込まれたバイト数を返します。 あるいは失敗した場合には FALSE を返します。

警告
この関数は論理値 FALSE を返す可能性がありますが、FALSE として評価される値を返す可能性もあります。 詳細については 論理値の セクションを参照してください。この関数の返り値を調べるには ===演算子 を 使用してください。

...
0バイト書き込めば0が返ってくるから実質FALSEになるので$result===0$result===''で使い分けるということのようです。

まとめ

建前

PHPはこういった想定外の落とし穴があるので注意しましょう。他の言語だとこういうのあんまりないと思います…。

本心

は??????マジで?????なにこのPHPの仕様クソすぎない????なんのためにboolがあるの????言語として破綻してない????酒飲みながら考えたみたいな仕様だな????

Java, C#, Objective C, Swift, Kotlin, JavaScript, Ruby, Python, Golang と触れてきたけどここまで書きにくい言語は初めてなので正直叫びたい。

PHP大っ嫌いだー!

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

【Laravel】ミドルウェア(Middleware)で任意のパラメータを渡す。

メモとして残します。

■やり方

ミドルウェア呼び出し側

下記の例ではルーティングでミドルウェアを呼び出しているが、基本的には変わらない(はず)

//複数の場合、第二パラメータ以降はカンマで区切る
Route::middleware('my_middleware:引数1,引数2')->group(function () {

});

ミドルウェア(my_middleware)側

ミドルウェアの第二引数$nextの次に任意のパラメータを入れる引数を定義する。

namespace App\Http\Middleware;
use Closure;
class MyMiddleware
{
    public function handle($request, Closure $next, $arg1="", $arg2="")
    {
        //$arg1=引数1
        //$arg2=引数2
        return $next($request);
    }
}

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

LaravelでエラーログをSlackに投稿したい

エラーログをSlackに投稿したい

G'sAcademyで出会った同期とチームで開発していたWebアプリケーション「HomeYou」
最近リリースしました!

それに伴ってエラー発生時にSlackに通知を送りたいと思い、試してみたところ
とても簡単にできたので、その方法を今回は書き留めていこうと思います。

リリースした「HomeYou」について...

と、その前に簡単にリリースしたアプリについても軽ーく説明させてもらいます。

今回リリースしたのは、
Twitterアカウントに匿名でレビュー(メッセージ)を残すことができる
HomeYou(ホームユー)」
というWebアプリケーションです。

SNSは、私たちの生活にとって切っても切れない関係になってきましたが、
リアルな交友関係とも繋がっていて踏みこんだことを発信するのは照れくさかったり、
自分のフィードに投稿が残ってしまい、時間が経つとどこか恥ずかしかったり、
また一方で、最近は誹謗・中傷が問題になっていたりと、
いろんな問題を抱えているな〜という課題感から
自由に自分の想いを投稿できて、かつ優しい世界を実現したいという想いから作ったサービスです。

HomeYouは、Twitterアカウントに対するレビュー(メッセージ)の匿名投稿、
そして、独自のNGワードでのフィルタリングなどがメインの機能となります。
また、心温まるレビューは、サービスを運営する私たちが投稿者の代わりにその相手へお伝えしていきます。

好きなアーティストへの熱い気持ちや
直接伝えるのは恥ずかしい身近な誰かに対するちょっとした感謝の気持ちなどを
気軽に投稿して遊んでみてください〜^^
(※投稿にはTwitterアカウントでのログインが必要です!)

では、次のセクションからエラーログをSlackに投稿する手順のお話をしていきます!

Slack通知の設定手順

①Incoming webhook URLを取得
②config/logging.phpと.env設定

こんな感じでとてもシンプルです!
Laravel5.6から標準でSlackへの通知ができるようになっており、
簡単に設定ができますので、個人でアプリを開発している方などは非常に便利だと思います。

手順① Incoming webhook URLを取得

(公式)Slack での Incoming Webhook の利用に記載の手順でIncoming webhook URLの取得を行います。(画像の赤枠の部分を使用します!)
スクリーンショット 2020-06-02 23.24.29.png

【参考ページ】
(公式)Slack API
slackのIncoming webhookが新しくなっていたのでまとめてみた

手順② config/logging.phpと.env設定

続いてlaravelのプロジェクトの設定を行っていきます。

.envファイル

まず.envファイルに先ほど取得したIncoming webhook URLとログレベルを追記します。
今回はエラーが発生した際に通知をしたいのでerrorとしていますが、
他にemergency、alert、critical、warning、notice、info、debugなどがあります。
(公式)Laravelログシステムの設定

LOG_SLACK_WEBHOOK_URL=https://hooks.slack.com/services/xxxx  // 先程取得したIncoming webhook
LOG_SLACK_LEVEL=error // 通知したいログレベル

config/logging.php

続いて、config/logging.phpを一部変更していきます。
'stack'=> ['channels' => ['single']の部分に'slack'を追加します。
'slack'=> ['level' => ['critical']の部分をenv('LOG_SLACK_LEVEL', 'critical'),と変更し、.envファイルから引っ張ってくるようにします。

また、.envファイル等を更新したので、php artisan config:cacheをお忘れなく!
変更後は、下記通りです。

config/logging.php
'channels' => [
        'stack' => [
            'driver' => 'stack',
            'channels' => ['single','slack'],
            'ignore_exceptions' => false,
        ],
        //省略
        'slack' => [
            'driver' => 'slack',
            'url' => env('LOG_SLACK_WEBHOOK_URL'),
            'username' => 'Laravel Log',
            'emoji' => ':boom:',
            'level' => env('LOG_SLACK_LEVEL', 'critical')
        ],
]

すると、Controllerで何らかのエラーが起きた時に
こんなエラーログがSlackに送られてくるようになります。
(※今回が定義していない関数を返してみました。)
スクリーンショット 2020-06-03 13.22.39.png

さらに、Slackに投稿されるログのフォーマットをカスタマイズすることができます!
'short' => trueを追記してみます。

config/logging.php
'slack' => [
    'driver' => 'slack',
    'url' => env('LOG_SLACK_WEBHOOK_URL'),
    'username' => 'Laravel Log',
    'emoji' => ':boom:',
    'level' => env('LOG_SLACK_LEVEL', 'critical'),
    'short' => true, // 短めなフォーマット
]

すると一部が結合されて、こんな感じに。
スクリーンショット 2020-06-03 13.07.06.png

さらに短くしたい場合は、、、
'context' => falseを追記してください。

config/logging.php
'slack' => [
    'driver' => 'slack',
    'url' => env('LOG_SLACK_WEBHOOK_URL'),
    'username' => 'Laravel Log',
    'emoji' => ':boom:',
    'level' => env('LOG_SLACK_LEVEL', 'critical'),
    'short' => true, // 短めなフォーマット
    'context' => false // context部分を表示しない
]

そうすると詳細部分が全く表示されなくなります。この辺はお好みで・・・!
スクリーンショット 2020-06-03 13.07.13.png

ただ、このままだと開発環境でのエラー等も通知がきてしまうため、
開発時の.envファイルはLOG_CHANNELの部分をsingleに変更しておくと良いと思います!

.env
LOG_CHANNEL=single

こんな感じで簡単にSlackにログの投稿ができるようになりました!
よかったらHomeYouも使ってみてください^^

Twitterアカウントに匿名でレビュー(メッセージ)を残すことができる「HomeYou」

参考ページ

(公式)Slack API
(公式)Slack での Incoming Webhook の利用
slackのIncoming webhookが新しくなっていたのでまとめてみた
(公式)Laravelログシステムの設定

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

UNIX時間(UNIX TIMESTAMP / タイムスタンプ)を普通の日付と時間に変換しながらランダムな日時を自動生成する

ランダムな日付だけでなくランダムな時刻も同時に生成

こんにちは。2038年問題まであと18年ですね。
今回は適当な日付と時間をランダムに作るPHPのコードサンプルです。
一応2038年問題も考慮して、date関数などは使わずにやりたいと思います。

2038年問題の詳しい解説はこちら

DateTimeクラスを使えばいいじゃない...という意見もありますが、フレームワークやライブラリが使えるなら「むしろCarbonでいいじゃない」ということでCarbonを使っております。

Laravelとかではお馴染みですね。CarbonはDateTimeクラスをオーバーラップした日付操作ライブラリなので、DateTimeクラスの上位互換と言えそうです。

仮に、何かしらのテスト用データを大量に挿入しつつ、更新日時をランダムに生成したいとします。Laravelのseedsにそういったコードを書いてみます。

ProductsTableSeeder.php
<?php

use Illuminate\Database\Seeder;
// Carbonを使うための宣言
use Carbon\Carbon;

// Products(商品)テーブルというものがあるとする
class ProductsTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        // ランダムに生成したい日時の期間を決める
        // 仮に 2001-01-01 00:00:00 から 2020-05-01 23:59:59 とする
        // 日付と時刻を format('U') でUNIXタイムスタンプへ変換しておく
        $start = new Carbon('2001-01-01 00:00:00');
        $startUnix = $start->format('U'); // 978274800 に変換される
        $end = new Carbon('2020-05-01 23:59:59');
        $endUnix = $end->format('U'); // 1588345199 に変換される

        // ループで id=1 から id=1000 までの商品を自動で登録
        for($i=1;$i<=1000;$i++){
            // 用意しておいた開始・終了日時のUNIXタイムスタンプを使用してランダムな数値を生成
            $randDate = mt_rand($startUnix, $endUnix);
            // ランダムなUNIXタイムスタンプを引数にしてインスタンスを作成
            $date = new Carbon($randDate);
            DB::table('products')->insert([
                'id' => $i,
                'name' => '商品名_'.$i,
                'created_at' => '2001-01-01 00:00:00',
                // 日付&時刻は必要に応じてフォーマットを変更可
                'updated_at' => $date->format('Y-m-d H:i:s'),
            ]);
        }
    }
}

日付や時間のフォーマットは基本的に date() の関数と同じパラメータが使えます。
date() -> パラメータ format

なお乱数を発生させるときは rand() ではなく mt_rand() を使う方が実行速度も速くて良いそうです。(randの4倍以上)
暗号化に使うのはいずれも推奨されませんが、文字通りランダムな値を得るためだけであれば問題ありません。

参考URL:

rand — 乱数を生成する
mt_rand — メルセンヌ・ツイスター乱数生成器を介して乱数値を生成する
【PHP入門】ランダムな数値・文字列を生成する(rand、mt_rand)
date — ローカルの日付/時刻を書式化する
DateTime クラス
テストデータ用にランダムな日付文字列をn個生成する
特定の2つの日付の間から、ランダムに1日を取得
【PHP】DateTimeでの日時取得とフォーマット方法まとめ
PHPで2038年問題を回避するには?すぐできる対策とコード例
「2038年問題」を華麗に解決!~エンジニアの仕事~
DateTimeクラスで日付文字列とUNIX時間(タイムスタンプ)を相互変換するときのまとめ
DateTime クラスのまとめメモ
PHPで日付時刻処理を書くならCarbonを使うべき

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

Laravelの動的whereを活用する

動的whereとは

Laravelでクエリを構築する場合、以下のように条件を指定すると思います。

//名前が「fuga」で、年齢が30歳のレコードを1件取得
Hoge::where('name', '=', 'fuga')->where('age', '=', 30)->first();

このクエリは、以下のように書くこともできます。

Hoge::whereName('fuga')->whereAge(30)->first();

つまり、whereXxxx('fuga')というメソッド名にすることで、where('xxxx', '=', 'fuga')と同等に使うことができます。
使えるのは=判定のみですが、少しだけ行を短くすることができます。

応用

複数のカラムに対して同時に指定することも可能です。

Hoge::whereNameAndAge('fuga', 30)->first();

こう書いても冒頭のクエリと同じ意味になります。

AndではなくOrで繋ぐことで、OR条件にすることもできます。
同じカラム名でも大丈夫です。

Hoge::whereNameOrNameAndAge('fuga', 'piyo', 25)->first();

And|Orで繋いでいけば何個でもカラムを指定できます。

注意点

すでに存在するメソッドの場合、うまく動作しません。
例えば、\Illuminate\Database\Eloquent\BuilderにはwhereKeyというメソッドが存在するため、keyというカラムに対して、whereKeyという動的whereは使用できません。1
class HogewhereXxxxというカラムがすでに存在した場合も、そちらが呼ばれるため動的な処理は行われません。

やりすぎにも注意です。
whereNameAndAge('fuga', 25)よりも、whereName('fuga')->whereAge(25)と書いてあったほうが、意味がわかりやすいかな?と思ったなら、そっちを選択してください。
動的whereが常に優れているわけではなく、選択肢が増えただけだと思っていただけると良いかと思います。

補足

whereXxxxというメソッドは当然実際には存在せず、動的に処理を行っているため、そのままだとIDEでエラーになります。
なので、class HogeのPHPDocにちゃんとメソッドを追加しておきましょう。

/**
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Eloquents\Hoge whereXxxx($value)
 */

  1. ほかのカラムとの組み合わせなら可能。whereKeyAndIdみたいな 

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

DockerでつまづくLaravel Dusk何なのお前

色々事情があってブラウザテストすることになったんですよ。
そう言えばLaravelには「Dusk」っていうイカしたブラウザテストユニットがあったなとか思い出して、試しに使ってみました。
https://readouble.com/laravel/5.5/ja/dusk.html

↑のドキュメント通り、duskをインストールし、動かしてみたら

# php artisan dusk
Cannot load Xdebug - it was already loaded
Cannot load Xdebug - it was already loaded
PHPUnit 6.5.14 by Sebastian Bergmann and contributors.

E                                                                   1 / 1 (100%)

Time: 1.29 seconds, Memory: 16.00MB

There was 1 error:


1) Tests\Browser\ExampleTest::testBasicExample
Facebook\WebDriver\Exception\UnknownServerException: unknown error: cannot find Chrome binary
  (Driver info: chromedriver=2.35.528139 (47ead77cb35ad2a9a83248b292151462a66cd881),platform=Linux 4.19.76-linuxkit x86_64)

は? chromeのバイナリがないだと?

いい忘れてたけど、環境

OS/ミドルウェア/FW バージョン
CentOS 7.5
Apache 2.4.6
php 7.2.28
Laravel 5.5.46

これをDockerで組んでます。

chromeを入れてみる

んじゃ、素直に入れてみますかね。
CentOSはepel入れるとchromiumを入れることができるようになります。

$ yum install -y epel-release
$ yum install -y chromium 

よしよし、うごかしてみっかー。んー、なかなか応答が返ってこないなー、、、お、今度は /session がダメとか言ってくるなー。

1) Tests\Browser\AdminTest::testTop
Facebook\WebDriver\Exception\WebDriverCurlException: Curl error thrown for http POST to /session with params: {"desiredCapabilities":{"browserName":"chrome","platform":"ANY","chromeOptions":{"binary":"","args":["--disable-gpu","--headless"]}}}

--no-sandbox を入れてみる

なんか調べども調べども seleniumコンテナ入れろ みたいなのばっかなんですよね。なんか負けたような気がするじゃないですか。気の所為でしょうけど。

んで、たどり着いたのはこちら。
Laravel DuskをDockerコンテナ内で起動するまで

なんと、 --no-sandbox フラグを付けるだけだと……!?

DuskTestCase.phpに追記しましょ。

DuskTestCase.php
    protected function driver()
    {
        $options = (new ChromeOptions)->addArguments([
            '--disable-gpu',
            '--headless',
            '--no-sandbox', //追記
        ]);

        return RemoteWebDriver::create(
            'http://localhost:9515', DesiredCapabilities::chrome()->setCapability(
                ChromeOptions::CAPABILITY, $options
            )
        );
    }

よし、これで動いた!

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

【Laravel】Homestead環境のファイルアップロード上限サイズを変更する

環境

  • Laravel Homestead 9.5.1
  • nginx 1.15.8
  • PHP 7.4.5

Nginxが返す413エラーを解消する

sudo vi /etc/nginx/nginx.conf

追記

/etc/nginx/nginx.conf
...
http {
...
        ##
        # Other Configs
        ##
        client_max_body_size 200m;
}
...

適用

sudo service nginx restart

Laravelが返す413エラーを解消する

Whoopsって言われるのでPHPの設定を変更する

※/etc/php/7.4/cli/php.iniは編集しても意味ないので注意

sudo vi /etc/php/7.4/fpm/php.ini

変更

/etc/php/7.4/fpm/php.ini(編集前)
...
post_max_size = 100M
...
upload_max_filesize = 100M
...

/etc/php/7.4/fpm/php.ini(編集後)
...
post_max_size = 200M
...
upload_max_filesize = 200M
...

適用

sudo service php7.4-fpm restart
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel フォームリクエストを使用してバリデーションを指定したら403エラーが出た

目的

  • フォームリクエスト(FormRequest)を使用してバリデーションを実装してブラウザから動作を確認したところルールにクリアしていても403エラーがでてしまい、当事象を解決した話をまとめる。

実施環境

  • ハードウェア環境
項目 情報
OS macOS Catalina(10.15.3)
ハードウェア MacBook Pro (16-inch ,2019)
プロセッサ 2.6 GHz 6コアIntel Core i7
メモリ 16 GB 2667 MHz DDR4
グラフィックス AMD Radeon Pro 5300M 4 GB Intel UHD Graphics 630 1536 MB
  • ソフトウェア環境
項目 情報 備考
PHP バージョン 7.4.3 Homwbrewを用いて導入
Laravel バージョン 7.0.8 commposerを用いて導入
MySQLバージョン 8.0.19 for osx10.13 on x86_64 Homwbrewを用いて導入

エラー内容

  • フォームリクエストを用いてバリデーションを実装し、定義したルールに違反していない状態でも下記のエラーが発生した。

    • 「403 This action is unauthorized.」

      スクリーンショット 2020-05-25 19.09.28.png

原因

  • このフォームリクエストを送信するための認証情報が存在しないためエラーが発生していた。
  • 本エラーをとにかく解決したい場合は当該のバリデーションルールが記載されているフォームリクエストクラスファイルを開きauthorizeメソッド内を修正する。

    • エラーの発生したフォームリクエストクラスファイルを下記に記載する。

      アプリ名ディレクトリ/app/Http/Requests/StoreContentPost.php
          <?php
      
          namespace App\Http\Requests;
      
          use Illuminate\Foundation\Http\FormRequest;
      
          class StoreContentPost extends FormRequest
          {
              /**
               * Determine if the user is authorized to make this request.
               *
               * @return bool
               */
              public function authorize()
              {
                  return false;
              }
      
              /**
               * Get the validation rules that apply to the request.
               *
               * @return array
               */
              public function rules()
              {
                  return [
                      //バリデーションルールを記載する
                      //'チェックするデータ名' => 'ルール1|ルール2'の様にルールを定義する
                      'title' => 'required',
                      'detail' => 'required',
                  ];
              }
          }
      
    • エラーを解決したしたフォームリクエストクラスファイルを下記に記載する。

      アプリ名ディレクトリ/app/Http/Requests/StoreContentPost.php
          <?php
      
          namespace App\Http\Requests;
      
          use Illuminate\Foundation\Http\FormRequest;
      
          class StoreContentPost extends FormRequest
          {
              /**
               * Determine if the user is authorized to make this request.
               *
               * @return bool
               */
              public function authorize()
              {
                  return true;
              }
      
              /**
               * Get the validation rules that apply to the request.
               *
               * @return array
               */
              public function rules()
              {
                  return [
                      //バリデーションルールを記載する
                      //'チェックするデータ名' => 'ルール1|ルール2'の様にルールを定義する
                      'title' => 'required',
                      'detail' => 'required',
                  ];
              }
          }
      
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Notification API + Laravel + Vue.js、 PWAで メッセージ機能を作る 作例編

概要

以前の 製作事例公開内容となりますが
会員メンバー間で、メッセージを送受信できる機能を
Laravel+ Vue でPWA対応、実装しました。
新着の自動更新は、JSタイマで起動し、
Notification API での通知等の仕組みとなります。

参考のコード / GitHub

https://github.com/kuc-arc-f/lara58a_7message

構成

Progressive Web Apps / PWA
Notification API
Laravel 5.8
Vue.js
javascript
nginx
mysql

migrations

https://github.com/kuc-arc-f/lara58a_7message/blob/master/database/migrations/2020_05_16_155945_create_messages_table.php

画像

・通知の画面
ss-msg-notification.png

・受信一覧、
 メールのような、受信、送信タブで切替表示としました

ss-message-receive-0524.png

実装など

・JSタイマー
 定期実行、自分宛の送信メッセージを監視し、
 新着があれば、トリガー発火して。新着通知等の処理を実行します。

 function set_time_text(){
    var data = {
                'user_id': USER_ID,
                'type': 1,
            };           
    axios.post('/api-1234' , data).then(res =>  {
        var item = res.data
        if(item.id != null){
            $("input#time_text").val( item.id );
            $("input#message_title").val( item.title );
        }else{
            $("input#time_text").val( 0 );
        }
console.log( item );
    });  
 }
 set_time_text();
var timer_func = function(){
     set_time_text();
};
var TIMER_SEC = 1000 * 600;
setInterval(timer_func, TIMER_SEC );

・新着の通知

function display_notification(title, body ){
    if (!('Notification' in window)) {//対応してない場合
        alert('未対応のブラウザです');
    }
    else {
        // 許可を求める
        Notification.requestPermission()
        .then((permission) => {
            if (permission === 'granted') {// 許可
                var options ={
                    body: body,
                    icon: 'https://hoge.net/icon.png',                                      
                    tag: ''
                };
                var n = new Notification(title,options);
                console.log(n);
                setTimeout(n.close.bind(n), 5000);
            }
            else if (permission == 'denied') {// 拒否
            }
            else if (permission == 'default') {// 無視
            }
        });
    }  
}


参考のページ

https://knaka0209.hatenablog.com/entry/lara58_26message

.

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