- 投稿日:2020-11-26T23:37:45+09:00
【ajax】本番環境で謎の403エラー
環境
- Laravel 8系
- PHP 7.4
- appache
実装したいこと
ajaxを使用して非同期でPATCH処理を行いたい。
本題
$.ajax({ type: 'PATCH', url: '/hoge_update', headers: { 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') }, data: { id: id, item: item, }, dataType: 'json', }).done(function (data) {こんな感じで非同期でPATCH処理を実装しようと思ったら、本番環境で
403 Forbidden
エラーが。調べてみるとどうやらapache側で許可されているのが
GET
POST
のみみたい(詳細はこちら)ただssh接続の許可がなかったり本番環境に入れない場合、confファイルを直接編集できないので、
$.ajax({ type: 'POST', //POSTに変更 url: '/hoge_update', headers: { 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') }, data: { _method: 'PATCH', //PATCHを追加 id: id, item: item, }, dataType: 'json', }).done(function (data) {だいぶ無理やりですがこれでしっかり200ステータスを返してくれました。
参考
- 投稿日:2020-11-26T21:10:29+09:00
作業ディレクトリを指定するオプションまとめ
普段は作業ディレクトリに移動して実行することが多いコマンドについて、作業ディレクトリを指定するオプションをまとめました。(ツールに偏りがありますが・・・)
artisan (Laravel)
実行したいプロジェクトの
artisan
ファイルを絶対パスで指定する。php /path/to/project/artisan migrateComposer
--working-dir
オプションまたは-d
オプションcomposer install --working-dir=/path/to/project composer install -d /path/to/projectGlobal Options - Command-line interface / Commands - Composer
Git
-C
オプションgit -C /path/to/project pull
npm
--prefix
オプションnpm install --prefix /path/to/projectYarn
--cwd
オプションyarn --cwd /path/to/project installSpecify working directory with yarn --cwd - CLI Introduction | Yarn
- 投稿日:2020-11-26T20:13:32+09:00
【Laravel】migrate:refresh と migrate:fresh の違い
- 投稿日:2020-11-26T18:23:21+09:00
Requestは、ただのバリデーションファイルじゃない【2020/11/26】
今まで僕は、LaravelのRequestファイル(ex userRequest.phpとか)は、バリデーションをするためにあるファイルだと思っていました。しかし、バリデーション機能はどちらかとういうとおまけ。
- △ バリデーション機能
- ◯ データを保持するオブジェクト + おまけでバリデーション
だった。
strutsでいう、ActionFormに一番近い(懐かしいな)。
ここからフォームやクエリパラメータに突っ込んだデータを取り出してくる。だから、Controllerファイルの中で、
xxxController.php$this->all()でデータとれるのはもちろん、
xxxRequest.php$this->all()と、Requestファイルの中でも普通に
$this
でデータが取れる。バリデーションしているだけなのになんで
Request
ファイルなのか疑問だったけど、get/postのリクエスト
を受け取っている紛れもないファイルだった。フレームワーク作る人って、すごいな。
- 投稿日:2020-11-26T16:14:31+09:00
[PHPUNIT]setupメソッド使用時のよくあるエラー
laravelのphpunitでsetUp()メソッドを定義したところ、エラーが出て詰まったので共有します。
現状
.phpclass ...Test extends \TestCase { public function setUp() { ... } }エラー文
PHP Fatal error: Declaration of W3\Controllers\...Test::setUp() must be compatible with Illuminate\Foundation\Testing\TestCase::setUp(): void in作成したテストのsetUp()の返り値と自動で作成されるIlluminate\Foundation\Testing\TestCase
のsetUp()の返り値が違うことでした。解決策
.phpclass ...Test extends \TestCase { public function setUp():void { ... } }上記のようにsetup()に:voidを追記することで、実行できるようになります。
会社の紹介
私は現在、株式会社ダイアログという物流×ITの会社に勤務しております。
2020年11月現在、エンジニアの募集はしていませんが、他にも様々な職種を募集しているので、Wantedlyのページをご覧ください。
- 投稿日:2020-11-26T16:02:14+09:00
LaravelのKernel.phpのscheduleメソッド内でcommandを使ってハマった件
PHPとLaravelのバージョン
- Laravel Framework 5.7.28
- PHP 7.3.11
出ていたエラー
ERROR: Aborted. {"exception":"[object] (Symfony\\Component\\Console\\Exception\\RuntimeException(code: 0): Aborted. at /home/hoge/hoge/hoge_api/vendor/symfony/console/Helper/QuestionHelper.php:135){"exception":"[object] (Symfony\\Component\\Console\\Exception\\CommandNotFoundException(code: 0): Command \"hoge\" is not defined.書いていたコード
app/Console/Kernal.php
protected function schedule(Schedule $schedule) { $schedule->command('hoge')->cron('* * * * *'); }app/Console/Commands/Hoge.php
/** * The name and signature of the console command. * * @var string */ protected $signature = 'command:hoge';解決策
下記が叩かれていてそんなものないよ、と怒られていたので
'/usr/bin/php' 'artisan' hogecommand:を付ける
protected function schedule(Schedule $schedule) { $schedule->command('command:hoge')->cron('* * * * *'); }そうすると下記が叩かれるようになります。
'/usr/bin/php' 'artisan' command:hoge
- 投稿日:2020-11-26T09:34:17+09:00
【Laravel Passport】APIで”Replicating claims as headers is deprecated and will removed from v4.0.”が発生した場合
要件だけ早急に。
Laravel Passportを使用し、APIの認証や実行時に、稀に以下のエラーが発生するようです。
Replicating claims as headers is deprecated and will removed from v4.0. Please manually set the header if you need it replicated.こちらは、関連ライブラリ”lcobucci/jwt”が、11/25にてv3.4.0へのアップデートが行われ、そのライブラリで不具合が発生している模様です。
https://github.com/lcobucci/jwt/issues/550早い段階でマイナーバージョンアップが入るとは思いますが、万が一このエラーが発生する場合、以下のコマンドを実行し、ダウングレードを行ってください。
composer require lcobucci/jwt=3.3.*公開しているサービスで問い合わせを受け、急いで調査。APIは割と影響度高いので。
- 投稿日:2020-11-26T09:33:07+09:00
Laravelでシングルアクションコントローラーを採用した際にInvalid route actionが出た件
はじめに
最近、アプリケーションアーキテクチャに興味を持ち、実際にLaravelでADR(Action Domain Responder)を試しています。Laravelは自由度が高いのでアーキテクチャ次第で全く違ったものになるという印象を受けています。
ADRには、1つのアクションとルートを対応させる事で複雑化を防ぐという思想があり、シングルアクションコントローラー(実際は、Action)を採用しました。(他にもメリットがあるかは勉強中です...)ルートが認識されない
公式を見つつシングルアクションクラスとルートを作成しました。
BookRegisterAction.php<?php namespace App\Http\Actions\Book; use App\Http\Controllers\Controller; final class BookRegisterAction extends Controller { public function __invoke() { // アクションの処理 } }以下のようにルーティングを設定。
web.phpRoute::prefix('book')->group(function () { Route::post('/register', App\Http\Actions\Book\BookRegisterAction::class)->name('book.register'); });すると下図のようなエラーが発生しました。
どうやらルーティングがだめとのこと。。。原因と解決策
Laravelはデフォルトで、コントローラーがApp\Http\Controllers\にあることを前提としています。
実際に発生したエラーには以下のような記載がありました。Illuminate\Routing\RouteAction::makeInvokable("App\Http\Controllers\App\Http\Actions\Book\BookRegisterAction")完全にデフォルト+追記したアクションになってます...
こちらはapp/Providers/RouteServiceProvider.phpに定義されているので修正を加えます。RouteServiceProvider.php<?php namespace App\Providers; class RouteServiceProvider extends ServiceProvider { protected $namespace = 'App\Http\Controllers'; ← ココがデフォルトのネームスペース /** * Define the "api" routes for the application. * * These routes are typically stateless. * * @return void */ protected function mapApiRoutes() { Route::prefix('api') ->middleware('api') ->namespace($this->namespace) ← ここを削除 ->group(base_path('routes/api.php')); }上記のように変更を加えるとルートを認識させることができました。(デフォルトのnamespaceを変更でも可能です)
よりよい解決策などあれば、ご教授お願いいたします。
- 投稿日:2020-11-26T09:33:07+09:00
シングルアクションコントローラーをLaravelで採用した際にInvalid route actionが出た件
はじめに
最近、アプリケーションアーキテクチャに興味を持ち、実際にLaravelでADR(Action Domain Responder)を試しています。Laravelは自由度が高いのでアーキテクチャ次第で全く違ったものになるという印象を受けています。
ADRには、1つのアクションとルートを対応させる事で複雑化を防ぐという思想があり、シングルアクションコントローラー(実際は、Action)を採用しました。(他にもメリットがあるかは勉強中です...)ルートが認識されない
公式を見つつシングルアクションクラスとルートを作成しました。
BookRegisterAction.php<?php namespace App\Http\Actions\Book; use App\Http\Controllers\Controller; final class BookRegisterAction extends Controller { public function __invoke() { // アクションの処理 } }以下のようにルーティングを設定。
web.phpRoute::prefix('book')->group(function () { Route::post('/register', App\Http\Actions\Book\BookRegisterAction::class)->name('book.register'); });すると下図のようなエラーが発生しました。
どうやらルーティングがだめとのこと。。。原因と解決策
Laravelはデフォルトで、コントローラーがApp\Http\Controllers\にあることを前提としています。
実際に発生したエラーには以下のような記載がありました。Illuminate\Routing\RouteAction::makeInvokable("App\Http\Controllers\App\Http\Actions\Book\BookRegisterAction")完全にデフォルト+追記したアクションになってます...
こちらはapp/Providers/RouteServiceProvider.phpに定義されているので修正を加えます。RouteServiceProvider.php<?php namespace App\Providers; class RouteServiceProvider extends ServiceProvider { protected $namespace = 'App\Http\Controllers'; ← ココがデフォルトのネームスペース /** * Define the "api" routes for the application. * * These routes are typically stateless. * * @return void */ protected function mapApiRoutes() { Route::prefix('api') ->middleware('api') ->namespace($this->namespace) ← ここを削除 ->group(base_path('routes/api.php')); }上記のように変更を加えるとルートを認識させることができました。(デフォルトのnamespaceを変更でも可能です)
よりよい解決策などあれば、ご教授お願いいたします。
- 投稿日:2020-11-26T04:49:03+09:00
Laravel で Target class [Controller] does not exist.が出た時の対応
事象
最近のLaravel (多分v8以降とかそのあたり)では、初期状態で以下のようなコードをroutes/web.phpに記述すると、あるはずのController Classを見つけられずエラーが発生する。
Route::get('/hoge', 'Controller@index');Illuminate\Contracts\Container\BindingResolutionException Target class [Controller] does not exist. http://laravel.internal/hoge Illuminate\Container\Container::build htdocs\laravel\vendor\laravel\framework\src\Illuminate\Container\Container.php:811どうやらContollerの初期位置を見失うようになったらしい。
対応
App/Providers/RouteServiceProvider.php の
$namespace
のコメントアウトを外す/** * The controller namespace for the application. * * When present, controller route declarations will automatically be prefixed with this namespace. * * @var string|null */ protected $namespace = 'App\\Http\\Controllers'; // ここがデフォルトでコメントアウトされるようになった参考等
https://kawax.biz/laravel8-routing/
(ここまで書いて理由とか気になってググったらこのブログで全部解決していた)
- 投稿日:2020-11-26T01:01:56+09:00
Centos7にてcomposer installを行うと「Your requirements could not be resolved to an installable set of packages.」と怒られた
なにが起こったか
Centos7に運用中のLaravelプロジェクトをクローンしてcomposer installしたらコケた。
$ composer install Loading composer repositories with package information Installing dependencies (including require-dev) from lock file Your requirements could not be resolved to an installable set of packages. Problem 1 - Installation request for php-di/invoker 2.1.0 -> satisfiable by php-di/invoker[2.1.0]. - php-di/invoker 2.1.0 requires php >=7.3 -> your PHP version (7.2.28) does not satisfy that requirement. Problem 2 - Installation request for doctrine/dbal 2.11.1 -> satisfiable by doctrine/dbal[2.11.1]. - doctrine/dbal 2.11.1 requires php ^7.3 -> your PHP version (7.2.28) does not satisfy that requirement. Problem 3 - php-di/invoker 2.1.0 requires php >=7.3 -> your PHP version (7.2.28) does not satisfy that requirement. - mnapoli/silly 1.7.2 requires php-di/invoker ~2.0 -> satisfiable by php-di/invoker[2.1.0]. - Installation request for mnapoli/silly 1.7.2 -> satisfiable by mnapoli/silly[1.7.2].解決方法
エラーメッセージを見る限りPHPのバージョン問題だったので、PHPを7.2から7.4へアップデートした。
※正確にはPHP7.3以上を求められていた。PHP7.4インストール
$ sudo yum install -y --enablerepo=remi-php74 php which み込んだプラグイン:fastestmirror, langpacks Loading mirror speeds from cached hostfile * base: ty1.mirror.newmediaexpress.com * epel: nrt.edge.kernel.org * extras: ty1.mirror.newmediaexpress.com * remi-php74: ftp.riken.jp * remi-safe: ftp.riken.jp * updates: ty1.mirror.newmediaexpress.com ...PHPインストール確認
$ php -v PHP 7.4.13 (cli) (built: Nov 24 2020 10:03:34) ( NTS ) Copyright (c) The PHP Group Zend Engine v3.4.0, Copyright (c) Zend Technologies with Zend OPcache v7.4.13, Copyright (c), by Zend Technologies with Xdebug v2.9.8, Copyright (c) 2002-2020, by Derick Rethans