20220224のPHPに関する記事は7件です。

Laravelのeloquentでjoinしたときに同じカラム名でバグる可能性

aテーブルのid=1 と bテーブルのid=2でa_id=1だとして、 これをjoinすると $a = A::join('b', 'a.id', '=', 'b.a_id')->first(); とする。 このとき $a->id; // 2 となる現象が起きました。 同じidというカラム名だからっぽいです。 このままだとidをキーにするのでリレーションで辿るデータなどがうまくとれないなど発生します。 知らないと結構やらかしそうな内容です。 回避は $a = A::select('*', 'a.id as id')->join('b', 'a.id', '=', 'b.a_id')->first(); とかですね。 あとはこれを起こさないためのグローバルスコープなんかもissueに書かれてました。 trait OnlyMyColumnsTrait { public static function bootOnlyMyColumnsTrait() { static::addGlobalScope('only_my_columns', function (Builder $builder) { $builder->select($builder->getModel()->getTable().'.*'); }); } }
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel】laravel-adminの導入から初期設定まで

概要 laravel-adminを利用して、インストールから初期設定までを行います。 実務でLaravelを使う機会があればlaravel-adminを使用する場面があるかもしれないのでこの機会にまずは設定をしていきます。 ※Laravelプロジェクトがインストール済みの前提で進めます。 laravel-adminとは Laravelで簡単に管理画面が構築できるライブラリです。 ドキュメントやデモサイトなど使用するために必要な資料が充実しており、難しいカスタムを行う必要がなければものすごく簡単に管理画面が構築できます。 公式ドキュメント demoサイト 実際にインストール 1. インストール $ composer require encore/laravel-admin 2. laravel-adminのファイルをプロジェクトに追加 $ php artisan vendor:publish --provider="Encore\Admin\AdminServiceProvider" 3. laravel-Adminの標準テーブルを生成 $ php artisan admin:install 4. もし管理者ログインデータが消えてしまった場合 こちらは管理者ログインデータが消えた場合に備えて、シーダーファイルを作成します。 laravel adminを実行した後にphp artisan migrate:freshなどをやると、管理者用ログインデータが消えてしまいます。 万が一に備えて、以下の記事に沿ってシーダーファイルを作成します。 管理者画面用のコントローラーを作成する 1. コントローラーの作成 公式ドキュメントには php artisan admin:make UserController --model=App\\User と記載がありますが、Laravel8系からはモデルのディレクトリがapp/Modelsになっていますので、以下コマンドを実行してコントローラーを作成します。 php artisan admin:make UserController --model=App\\Models\\User ####2. ルーティングを追記 /app/Admin/routes.php <?php use Illuminate\Routing\Router; Admin::routes(); Route::group([ 'prefix' => config('admin.route.prefix'), 'namespace' => config('admin.route.namespace'), 'middleware' => config('admin.route.middleware'), 'as' => config('admin.route.prefix') . '.', ], function (Router $router) { $router->get('/', 'HomeController@index')->name('home'); $router->resource('/users', UserController::class); //追記内容 }); これで/admin/usersにアクセスするとユーザーの一覧画面が閲覧できるようになります。 他にも/config/admin.phpで設定の変更、Admin / bootstrap.phpでコンポーネントを拡張または削除したり、フロントエンドリソースを導入したりできますが、ここでは特に設定の変更はせず、またの機会に記事にしようと思います。 最後に 今回は初期設定からほぼコードをいじらずにインストールから初期設定するという内容でした。 まだまだ勉強中ですが、色々使い方を知って記事にしていきます。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

php xml request with curl

<?php $xmldata = '<?xml version="1.0" encoding="UTF-8"?> <student> <info> <name>Rahul kumar</name> <age>10</age> <class>5th</class> <rollno>25</rollno> </info> </student>'; $url = "https://www.website.com/ws"; $ch = curl_init(); if (!$ch) { die("Couldn't initialize a cURL handle"); } curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_TIMEOUT, 60); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: text/xml')); curl_setopt($ch, CURLOPT_POSTFIELDS, $xmldata); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); $result = curl_exec($ch); // execute echo $result; //show response curl_close($ch); ?>
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Laravel] HTTPS での接続を強制する

Laravel を使ったサイトをさっき検証環境、本番環境にリリースしたらHTTPとHTTPSが混在してるよ!!という事でうまく動きませんでした。 {!! Form::open(array('url' => '/login', 'role' => 'form', 'name' => 'loginForm', 'id' => 'loginForm', 'class' => 'login')) !!} こういう記述があるとHTTPSページ内にあるフォームのPOST先がHTTPになってエラーになったりします。 こちらの解決方法を以下に記します。 結論 web.php に以下を記述します。 if (App::environment('production') || App::environment('staging')) { URL::forceScheme('https'); } App::environment('production')は本番環境の.envファイルにAPP_ENV=productionと記述されている前提で動きます。 App::environment('staging')は検証環境の.envファイルにAPP_ENV=stagingと記述されている前提で動きます。 これで全てのリクエストはHTTPSに統一されます。 以上
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel9.x変更点

はじめに LaravelのUpgrade Guideをもとに影響度がミディアム以上のものを日本語訳もといDeepLにつっこんでみたものです。 明らかに変な日本語になってると感じたとこは自力で頑張ります。 目次 依存関係の更新 PHPの戻り値の型 アプリケーション Flysystem_3.x ヘルパー関数 HTTP Client Symfony_Mailer Packages Test Validation 依存関係の更新 PHPのバージョンは 8.0.2以上を必要とします。 composer.jsonで以下の依存関係を更新する必要があります。 laravel/framework to ^9.0 nunomaduro/collision to ^6.1 また、facade/ignitionをspatie/laravel-ignition: "^1.0"に置き換えてください。 さらに、以下のファーストパーティパッケージは、Laravel 9.x をサポートするために新しいメジャーリリースを受け取りました。 Vonage Notification Channel (v3.0)(Replaces Nexmo) 最後に、アプリケーションで利用される他のサードパーティパッケージを調べ、Laravel 9のサポートに適切なバージョンを使用しているかどうかを確認します。 PHPの戻り値の型 PHP では、offsetGet、offsetSet などの PHP メソッドに戻り値の型定義が必要になるように移行し始めています。これを踏まえて、Laravel9では、コードベースにこれらの戻り値の型を実装しています。通常、ユーザーが書いたコードには影響しませんが、Laravelのコアクラスを拡張してこれらのメソッドをオーバーライドしている場合は、これらの戻り値の型を自分のアプリケーションやパッケージのコードに追加する必要があります。 count(): int getIterator(): Traversable getSize(): int jsonSerialize(): array offsetExists($key): bool offsetGet($key): mixed offsetSet($key, $value): void offsetUnset($key): void さらに、PHP の SessionHandlerInterface を実装したメソッドに戻り値の型が追加されました。繰り返しますが、この変更があなた自身のアプリケーションやパッケージのコードに 影響を与えることはまずありません。 open($savePath, $sessionName): bool close(): bool read($sessionId): string|false write($sessionId, $data): bool destroy($sessionId): bool gc($lifetime): int アプリケーション Eloquent Custom Casts & null Laravelの以前のリリースでは、カスタムキャストクラスのsetメソッドは、キャスト属性がNULLに設定されている場合は呼び出されませんでした。しかし、この動作はLaravelのドキュメントと矛盾していました。Laravel 9.xでは、キャストクラスのsetメソッドは、提供された$value引数としてnullで呼び出されます。したがって、カスタムキャストがこのシナリオを十分に処理できるようにする必要があります。 /** * Prepare the given value for storage. * * @param \Illuminate\Database\Eloquent\Model $model * @param string $key * @param AddressModel $value * @param array $attributes * @return array */ public function set($model, $key, $value, $attributes) { if (! $value instanceof AddressModel) { throw new InvalidArgumentException('The given value is not an Address instance.'); } return [ 'address_line_one' => $value->lineOne, 'address_line_two' => $value->lineTwo, ]; } Belongs To Many firstOrNew, firstOrCreate, updateOrCreate 関数 belongsToMany リレーションの firstOrNew、firstOrCreate、および updateOrCreate メソッドはすべて、その最初の引数として属性の配列を受け取ります。Laravelの以前のリリースでは、この属性の配列は、既存のレコードの「ピボット」/中間テーブルと比較されました。 しかし、この動作は予期しないものであり、一般的には望まれないものでした。代わりに、これらのメソッドは、関連するモデルのテーブルに対して、属性の配列を比較するようになりました。 $user->roles()->updateOrCreate([ 'name' => 'Administrator', ]); さらに、firstOrCreate メソッドの第二引数に $values 配列を指定することができるようになりました。この配列は、関連するモデルがまだ存在しない場合、作成時にメソッドの最初の引数 ($attributes) とマージされます。この変更により、このメソッドは他のリレーションシップタイプによって提供される firstOrCreate メソッドと一致するようになります。 $user->roles()->firstOrCreate([ 'name' => 'Administrator', ], [ 'created_by' => $user->id, ]); Flysystem_3.x Laravel 9.x は Flysystem 1.x から 3.x に移行しました。Flysystem は、Storage ファサードが提供するすべてのファイル操作メソッドを提供します。これを踏まえて、アプリケーション内でいくつかの変更が必要になるかもしれませんが、可能な限りシームレスに移行できるようにしました。 ドライバの前提条件 S3、FTP、またはSFTPドライバーを使用する前に、Composerパッケージ・マネージャーで適切なパッケージをインストールする必要があります。 Amazon S3: composer require -W league/flysystem-aws-s3-v3 "^3.0" FTP: composer require league/flysystem-ftp "^3.0" SFTP: composer require league/flysystem-sftp-v3 "^3.0" 既存ファイルの上書き put, write, writeStream などの書き込み操作は、デフォルトで既存のファイルを上書きするようになりました。既存のファイルを上書きしたくない場合は、書き込み操作を行う前に、手動でファイルの存在を確認する必要があります。 消えたファイルの読み込み 存在しないファイルから読み込もうとすると、null を返すようになりました。Laravelの以前のリリースでは、IlluminateContracts\Filesystem\FileNotFoundExceptionがスローされていました。 消えたファイルの削除 存在しないファイルを削除しようとすると、trueを返すようになりました。 キャッシュされたアダプタ Flysystem は、「キャッシュされたアダプタ」をサポートしなくなりました。したがって、Laravelから削除され、関連する設定(ディスク設定内のキャッシュキーなど)は削除することができます。 カスタムファイルシステム カスタムファイルシステムドライバの登録に必要な手順が若干変更されました。したがって、もしあなたが独自のカスタムファイルシステムドライバを定義していたり、カスタムドライバを定義しているパッケージを使用していた場合は、あなたのコードと依存関係を更新する必要があります。 例えば、Laravel8.xの場合、カスタムファイルシステムドライバは、以下のように登録します。 use Illuminate\Support\Facades\Storage; use League\Flysystem\Filesystem; use Spatie\Dropbox\Client as DropboxClient; use Spatie\FlysystemDropbox\DropboxAdapter; Storage::extend('dropbox', function ($app, $config) { $client = new DropboxClient( $config['authorization_token'] ); return new Filesystem(new DropboxAdapter($client)); }); ただし、Laravel 9.xでは、Storage::extendメソッドに与えられるコールバックは、IlluminateFilesystemAdapterのインスタンスを直接返す必要があります。 use Illuminate\Filesystem\FilesystemAdapter; use Illuminate\Support\Facades\Storage; use League\Flysystem\Filesystem; use Spatie\Dropbox\Client as DropboxClient; use Spatie\FlysystemDropbox\DropboxAdapter; Storage::extend('dropbox', function ($app, $config) { $adapter = new DropboxAdapter(new DropboxClient( $config['authorization_token'] );); return new FilesystemAdapter( new Filesystem($adapter, $config), $adapter, $config ); }); ヘルパー関数 when/unless関数 ご存知のように、フレームワークの様々なクラスでwhenやunlessメソッドが提供されています。これらのメソッドは、メソッドの最初の引数のブール値が true または false と評価された場合に、条件付きでアクションを実行するために使うことができます。 $collection->when(true, function ($collection) { $collection->merge([1, 2, 3]); }); したがって、Laravelの以前のリリースでは、クロージャーオブジェクト(または他のオブジェクト)に対する緩い比較は常に真と評価されるので、クロージャーをwhenまたはunlessメソッドに渡すと、条件操作が常に実行されることを意味しました。開発者は、クロージャの結果が、条件付きアクションが実行されるかどうかを決定するブール値として使用されることを期待しているので、これはしばしば予期しない結果につながりました。 そのため、Laravel9.xでは、whenやunlessメソッドに渡されたクロージャが実行され、クロージャが返す値がwhenやunlessメソッドが使用するBoolean値とみなされることになります。 $collection->when(function ($collection) { // This closure is executed... return false; }, function ($collection) { // Not executed since first closure returned "false"... $collection->merge([1, 2, 3]); }); HTTP_Client デフォルトのタイムアウト HTTPクライアントのデフォルトのタイムアウトが30秒になりました。つまり、30秒以内にサーバーから応答がない場合、例外が発生します。以前は、HTTP クライアントにデフォルトのタイムアウト長が設定されていなかったため、リクエストが無限に "hang" することがありました。 特定のリクエストに対してより長いタイムアウトを指定したい場合は、timeoutメソッドを使用して指定することができます。 $response = Http::timeout(120)->get(...); Symfony_Mailer Laravel 9.xの最大の変更点は、2021年12月をもってメンテナンスが終了したSwiftMailerから、Symfony Mailerへの移行です。しかし、この移行はお客様のアプリケーションにとって可能な限りシームレスに行えるようにしました。とはいえ、以下の変更点のリストを十分に確認し、アプリケーションが完全に互換性を持っていることを確認してください。 ドライバーの前提条件 Mailgun トランスポートを使い続けるには、アプリケーションに symfony/mailgun-mailer と symfony/http-client Composer パッケージが必要です。 composer require symfony/mailgun-mailer symfony/http-client wildbit/swiftmailer-postmark Composer パッケージは、アプリケーションから削除する必要があります。代わりに、アプリケーションは symfony/postmark-mailer と symfony/http-client のコンポーザーパッケージを必要とするはずです。 composer require symfony/postmark-mailer symfony/http-client 戻り値型の更新 send、html、text、plainの各メソッドは、メッセージを受信した受信者の数を返さなくなりました。代わりに、IlluminateMailのインスタンスが返されます。このオブジェクトは、getSymfonySentMessageメソッドまたはオブジェクトのメソッドを動的に呼び出すことによってアクセス可能なSymfonyのIntemptMailerのインスタンスを含んでいます。 Swift関数に改名 SwiftMailer に関連する様々なメソッドのうち、文書化されていないものは、Symfony Mailer に対応するものに名前が変更されました。たとえば、withSwiftMessage メソッドは withSymfonyMessage に名前が変更されました。 laravel8.x $this->withSwiftMessage(function ($message) { $message->getHeaders()->addTextHeader( 'Custom-Header', 'Header Value' ); }); laravel9.x use Symfony\Component\Mime\Email; $this->withSymfonyMessage(function (Email $message) { $message->getHeaders()->addTextHeader( 'Custom-Header', 'Header Value' ); }); Symfony Mailerのドキュメントで、SymfonyComponentのMimeEmailオブジェクトとのすべての可能なインタラクションを十分に確認してください。 Packages lang ディレクトリ 新しいLaravelアプリケーションでは、resources/langディレクトリは、プロジェクトのルートディレクトリ(lang)に配置されるようになりました。パッケージがこのディレクトリに言語ファイルを発行している場合、パッケージがハードコードされたパスではなく、app()->langPath()に発行していることを確認する必要があります。 Test assertDeleted関数 assertDeleted メソッドのすべての呼び出しを assertModelMissing に更新する必要があります。 Validation パスワードルール 与えられた入力値が認証されたユーザーの現在のパスワードと一致するかどうかを検証するパスワードルールは、current_passwordに名前が変更されました。 無効な配列キー Laravelの以前のリリースでは、Laravelのバリデータが返す「検証済み」データから検証されていない配列キーを除外するように手動で指示する必要がありました。特に、許可されるキーのリストを指定しない配列ルールと組み合わせた場合です。 しかし、Laravel 9.xでは、配列ルールで許容キーが指定されていない場合でも、検証されていない配列キーは常に「検証済み」データから除外されます。通常、この動作は最も期待される動作であり、以前のexcludeUnvalidatedArrayKeysメソッドは、後方互換性を保つために一時的な措置としてLaravel 8.xに追加されただけでした。 推奨はしませんが、アプリケーションのサービスプロバイダーのブートメソッド内で新しいincludeUnvalidatedArrayKeysメソッドを呼び出すことで、以前のLaravel 8.xの動作にオプトインすることができます。 use Illuminate\Support\Facades\Validator; /** * Register any application services. * * @return void */ public function boot() { Validator::includeUnvalidatedArrayKeys(); }
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

twitterを快活クラブから借りたパソコンでリモワで見るWebサービス

リモワ対応 借りたマシンでも仕事できるように調整中 一時行政系も 効率よく情報を配信する道具として使っていましたね あのあと使えなくなった人が結構いて 悩ましいです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

GitHub Actions workflowについてのススメ

概要 GitHubActionsを利用したテストワークフローの構築について社内布教用にまとめてみた 経緯 @ucan-lab さんのハンズオンに参加して個人的に導入はしているがチーム内で技術共有をしてなかったので布教用としてまとめることにしました なお、今回のworkflowについては以下のハンズオン資料を流用させていただいています。 解説 GitHub リポジトリの [Actions] タブに表示されるワークフローの名前。 name: Laravel Testing on:ワークフローを発火させるトリガーを指定します pull_request: PRが作成されたタイミングをトリガーします branches:特定のブランチに対してのPRに対してだけトリガーします(デフォルトは全てのブランチが対象です) on: pull_request: branches: - main runs-on: ubuntu-latest: 実行する仮想マシンを指定します(今回はubuntuの最新版) steps:ジョブのステップをグループ化する uses: actions/checkout@v2 : リポジトリをチェックアウトし、ワークフローがアクセス可能にする jobs: laravel-testing: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name :GitHubに表示するステップの名前 run:コマンドを実行するようにジョブに指示を出します steps: - name: Docker Version run: docker version run: |:複数コマンド順に実行します docker-compose exec -T :擬似TTY(疑似端末)への割り当てを無効にする ttyとは、標準入出力となっている端末デバイス(制御端末、controlling terminal)の名前を表示するUnix系のコマンドである。元来ttyとはteletypewriter(テレタイプライター)のことを指す。 steps: - name: OS Version # -T 擬似TTY(標準出力の接続先デバイス)への割り当てを無効 run: | docker-compose exec -T app cat /etc/os-release docker-compose exec -T app cat /etc/debian_version 全体 .github/workflows/laravel-testing.yml name: Laravel Testing on: pull_request: branches: - main jobs: laravel-testing: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Docker Version run: docker version - name: Build Docker Images run: docker-compose build - name: Create & Start Docker Containers run: docker-compose up -d - name: OS Version # -T 擬似TTY(標準出力の接続先デバイス)への割り当てを無効 run: | docker-compose exec -T app cat /etc/os-release docker-compose exec -T app cat /etc/debian_version - name: PHP Version run: docker-compose exec -T app php --version - name: Composer Version run: docker-compose exec -T app composer --version - name: Install Dependencies run: docker-compose exec -T app composer install - name: Laravel Version run: docker-compose exec -T app php artisan --version - name: Laravel Setting run: | docker-compose exec -T app cp .env.example .env docker-compose exec -T app php artisan key:generate - name: Laravel Migrate Testing run: docker-compose exec -T app php artisan migrate - name: Laravel Rollback Testing run: docker-compose exec -T app php artisan migrate:refresh - name: Laravel Seeding Testing run: docker-compose exec -T app php artisan db:seed - name: Laravel PHPUnit Testing run: docker-compose exec -T app php artisan test
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む