20201126のlaravelに関する記事は11件です。

【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ステータスを返してくれました。

参考

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

作業ディレクトリを指定するオプションまとめ

普段は作業ディレクトリに移動して実行することが多いコマンドについて、作業ディレクトリを指定するオプションをまとめました。(ツールに偏りがありますが・・・)

artisan (Laravel)

実行したいプロジェクトの artisan ファイルを絶対パスで指定する。

php /path/to/project/artisan migrate

Composer

--working-dir オプションまたは -d オプション

composer install --working-dir=/path/to/project
composer install -d /path/to/project

Global Options - Command-line interface / Commands - Composer

Git

-C オプション

git -C /path/to/project pull

-C - Git - git Documentation

npm

--prefix オプション

npm install --prefix /path/to/project

prefix - config | npm Docs

Yarn

--cwd オプション

yarn --cwd /path/to/project install

Specify working directory with yarn --cwd - CLI Introduction | Yarn

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

【Laravel】migrate:refresh と migrate:fresh の違い

migrate:refresh

down() を実行してから up() を実行する。なので down() の内容によっては up() の処理に影響を与える可能性がある。1

migrate:fresh

全テーブルをドロップしてから up() を実行する。 down() は実行されない。

参考


  1. ゴミデータを残してしまったり等 

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

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のリクエストを受け取っている紛れもないファイルだった。

フレームワーク作る人って、すごいな。

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

[PHPUNIT]setupメソッド使用時のよくあるエラー

laravelのphpunitでsetUp()メソッドを定義したところ、エラーが出て詰まったので共有します。

現状

.php
class ...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()の返り値が違うことでした。

解決策

.php
class ...Test extends \TestCase
{
    public function setUp():void
    {
       ...
    }
}

上記のようにsetup()に:voidを追記することで、実行できるようになります。

会社の紹介

私は現在、株式会社ダイアログという物流×ITの会社に勤務しております。
2020年11月現在、エンジニアの募集はしていませんが、他にも様々な職種を募集しているので、Wantedlyのページをご覧ください。

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

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' hoge 

command:を付ける

    protected function schedule(Schedule $schedule)
    {
        $schedule->command('command:hoge')->cron('* * * * *');
    }

そうすると下記が叩かれるようになります。

'/usr/bin/php' 'artisan' command:hoge
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【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は割と影響度高いので。

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

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.php
Route::prefix('book')->group(function () {
    Route::post('/register', App\Http\Actions\Book\BookRegisterAction::class)->name('book.register');
});

すると下図のようなエラーが発生しました。
スクリーンショット 2020-11-23 9.56.05.png
どうやらルーティングがだめとのこと。。。

原因と解決策

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を変更でも可能です)
よりよい解決策などあれば、ご教授お願いいたします。

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

シングルアクションコントローラーを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.php
Route::prefix('book')->group(function () {
    Route::post('/register', App\Http\Actions\Book\BookRegisterAction::class)->name('book.register');
});

すると下図のようなエラーが発生しました。
スクリーンショット 2020-11-23 9.56.05.png
どうやらルーティングがだめとのこと。。。

原因と解決策

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を変更でも可能です)
よりよい解決策などあれば、ご教授お願いいたします。

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

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/
(ここまで書いて理由とか気になってググったらこのブログで全部解決していた)

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

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

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