20210802のPHPに関する記事は9件です。

Laravelの使える?ヘルパ関数

Laravel8のヘルパ関数で実際に使った使えたものをまとめる Laravelではグローバルに使える関数が多数あり、それらを使用することにより開発効率や可読性が向上します。 そのため用途にあったものがある場合、積極的に使用するようにしましょう。 以下では用途にまとめてヘルパ関数を記載しています。 パス mix() mix関数は、バージョンつけしたMixファイルのパスを取得します。 $path = mix('css/app.css'); storage_path() storage_path関数は、アプリケーションのstorageディレクトリへの完全修飾パスを返します。storage_path関数を使用して、ストレージディレクトリ内の特定のファイルへの完全修飾パスを生成することもできます。 $path = storage_path(); $path = storage_path('app/file.txt'); 文字列 Str::lower() Str::lowerメソッドは指定文字列を小文字に変換します。 use Illuminate\Support\Str; $converted = Str::lower('LARAVEL'); // laravel Str::upper() Str::upperメソッドは、指定文字列を大文字に変換します。 use Illuminate\Support\Str; $string = Str::upper('laravel'); // LARAVEL Str::substr() Str::substrメソッドは開始位置と文字列長の引数で指定した部分文字列を返します。 use Illuminate\Support\Str; $converted = Str::substr('The Laravel Framework', 4, 7); // Laravel Str::replace() Str::replaceメソッドは、文字列内の指定した文字列を置き換えます。 use Illuminate\Support\Str; $string = 'Laravel 8.x'; $replaced = Str::replace('8.x', '9.x', $string); // Laravel 9.x Fluent文字列 Fluent文字列はオブジェクト指向で、複数の文字列操作をチェーンできるインターフェイスを提供しています。 複数の文字列操作をする場合は、自然言語のように記述できるため、コードの可読性が上がります。 Str::of()の引数に対象の文字列を指定して使用します。 append appendメソッドは、指定値を文字列へ追加します。 use Illuminate\Support\Str; $string = Str::of('Taylor')->append(' Otwell'); // 'Taylor Otwell' contains containsメソッドは、指定された文字列に指定された値が含まれているかどうかを判別します。このメソッドは大文字と小文字を区別します。 use Illuminate\Support\Str; $contains = Str::of('This is my name')->contains('my'); // true is isメソッドは、指定文字列が指定パターンに一致するかどうかを判別します。アスタリスクはワイルドカード値として使用できます use Illuminate\Support\Str; $matches = Str::of('foobar')->is('foo*'); // true $matches = Str::of('foobar')->is('baz*'); // false trim trimメソッドは、文字列をトリムします。 use Illuminate\Support\Str; $string = Str::of(' Laravel ')->trim(); // 'Laravel' $string = Str::of('/Laravel/')->trim('/'); // 'Laravel' when whenメソッドは指定条件がtrueの場合、指定したクロージャを呼び出します。クロージャは、fluent文字列インスタンスを受け取ります。 use Illuminate\Support\Str; $string = Str::of('Taylor') ->when(true, function ($string) { return $string->append(' Otwell'); }); // 'Taylor Otwell' 必要であれば、3番目のパラメータとして別のクロージャをwhenメソッドに渡せます。このクロージャは、条件パラメータがfalseと評価された場合に実行します。 use Illuminate\Support\Str; $string = Str::of('Steve') ->when(false, function ($string) { return $string->append(' Otwell'); }, function ($string) { return $string->append(' Jobs'); }); // 'Steve Jobs' URL route() route関数は、指定した名前付きルートのURLを生成します。 $url = route('route.name'); ルートがパラメーターを受け入れる場合は、それらを関数の2番目の引数として渡すことができます。 $url = route('route.name', ['id' => 1]); デフォルトでは、route関数は絶対URLを生成します。相対URLを生成する場合は、関数の3番目の引数としてfalseを渡してください。 $url = route('route.name', ['id' => 1], false); その他 abort() abort関数は、例外ハンドラによりレンダーされるであろう、HTTP例外を投げます。 abort(403); ブラウザに送信する必要のある例外のメッセージとカスタムHTTP応答ヘッダを指定することもできます。 abort(403, 'Unauthorized.', $headers); abort_if() abort_if関数は、指定された論理値がtrueと評価された場合に、HTTP例外を投げます。 abort_if(! Auth::user()->isAdmin(), 403); abortメソッドと同様に、例外の応答テキストを3番目の引数として指定し、カスタム応答ヘッダの配列を4番目の引数として関数に指定することもできます。 abort_unless() abort_unless関数は、指定した論理値がfalseと評価された場合に、HTTP例外を投げます。 abort_unless(Auth::user()->isAdmin(), 403); abortメソッドと同様に、例外の応答テキストを3番目の引数として指定し、カスタム応答ヘッダの配列を4番目の引数として関数に指定することもできます。 collect() collect関数は、指定値からコレクションインスタンスを生成します。 $collection = collect(['taylor', 'abigail']); logger() logger関数は、debugレベルのメッセージをログへ書き出します。 logger('Debug message'); 関連情報の配列を関数へ渡すこともできます。 logger('User has logged in.', ['id' => $user->id]); 関数に値を渡さない場合は、ロガーインスタンスが返されます。 logger()->error('You are not allowed here.'); dd() dd関数は指定された変数の内容を表示し、スクリプトの実行を停止します。 dd($value); dd($value1, $value2, $value3, ...); スクリプトの実行を停止したくない場合は、代わりにdump関数を使ってください。 dump() dump関数は指定した変数をダンプします。 dump($value); dump($value1, $value2, $value3, ...); now() now関数は、現時点を表す新しいIlluminate\Support\Carbonインスタンスを生成します。 $now = now(); optional() optional関数はどんな引数も指定でき、そのオブジェクトのプロパティへアクセスするか、メソッドを呼び出せます。指定したオブジェクトがnullだった場合、エラーを発生させる代わりに、プロパティとメソッドはnullを返します。 return optional($user->address)->street; {!! old('name', optional($user)->name) !!} optional関数は、2番目の引数としてクロージャも受け入れます。最初の引数として指定された値がnullでない場合、クロージャが呼び出されます。 return optional(User::find($id), function ($user) { return $user->name; }); 参考
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

プログラミング初心者が書いたマイグレーションのやり方について

はじめに 現在Laravelを学習しているプログラミング初心者の僕が 今回はマイグレーションのやり方について記載していきたいと思います。 マイグレーションとは? マイグレーションとはデータベースのバージョン管理機能のことを指します。 PHPのスクリプトを使うことによりテーブルの作成処理などを用意することが出来るのです。 マイグレーションの手順としては以下のようになります。 マイグレーションファイルの作成 スクリプトの記述 マイグレーションの実行 マイグレーションファイルの作成~実行まで 現在作成しているプロジェクトに移動してから以下のコマンドを実行します。 (僕は今回peopleというファイルを作ります) $ php artisan make:migration cretate_people_table するとdatabaseフォルダのmigrationsフォルダの中に xxxxx_create_people_table.phpというファイルが新たに作られていると思います。 (xxxxxには作成した日時が書いてある) xxxxx_create_people_table.php <?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; class CreatePeopleTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('people', function (Blueprint $table) { $table->bigIncrements('id'); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('people'); } } 続いては上記のコードにテーブル生成と削除の処理を記載していきます。 public function up() { Schema::create('people', function (Blueprint $table) { $table->bigIncrements('id'); $table->string('name'); //追記 $table->string('mail'); //追記 $table->integer('age'); //追記 $table->timestamps(); }); } これでテーブルの生成は完了です。 テーブルの生成方法は下記の通りです。 public function up() { Schema::create('テーブル名', function (Blueprint $table) { $table->型('フィールド名'); }); } 続いてテーブルの削除処理となります。 削除処理のメソッドはすでにデフォルトで下記のコードが記述されています。 public function down() { Schema::dropIfExists('people'); //テーブルがあれば削除 } ここは特に変更するポイントは御座いません。 そして最後にこの作成したファイルを基にマイグレーションを実行します $ php artisan migrate うまく成功すると画像のようになります 個人的な感想ですが、マイグレーションがうまく決まった時の気持ち良さは結構好きです笑 ちなみにmigrateして上手くいかなかった場合はまとめて巻き戻すことも出来ます。 $ php artisan migrate:rollback 以上がマイグレーションの作成〜実行となります。 問題なく進めばあっという間に完成できるので良ければやってみてください! 参考記事 https://qiita.com/shosho/items/a5a5839735dfef9214b1 https://readouble.com/laravel/5.6/ja/migrations.html
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel】package不足でcomposer installができない

既存のLaravelプロジェクトをインストールする工程で、composer installをしますが、 [ec2-user@ip-172-31-39-229 laravel]$ composer install PHP Warning: PHP Startup: Unable to load dynamic library 'pdo' (tried: /opt/remi/php74/root/usr/lib64/php/modules/pdo (/opt/remi/php74/root/usr/lib64/php/modules/pdo: cannot open shared object file: No such file or directory), /opt/remi/php74/root/usr/lib64/php/modules/pdo.so (/opt/remi/php74/root/usr/lib64/php/modules/pdo.so: cannot open shared object file: No such file or directory)) in Unknown on line 0 No composer.lock file present. Updating dependencies to latest instead of installing from lock file. See https://getcomposer.org/install for more information. Loading composer repositories with package information Updating dependencies Your requirements could not be resolved to an installable set of packages. Problem 1 - doctrine/dbal[v2.10.0, ..., 2.13.x-dev] require ext-pdo * -> it is missing from your system. Install or enable PHP's pdo extension. - Root composer.json requires doctrine/dbal ^2.10 -> satisfiable by doctrine/dbal[v2.10.0, ..., 2.13.x-dev]. ... と出て、うまく動かなかった。 エラー文:パッケージが不足している ので、パッケージをインストールしていけばいいんですが、EC2だとインストールしたphpのバージョン毎に合わせて入れてあげる必要があります。 私の環境のphpのverionは7.4.22なので、 [ec2-user@ip-172-31-39-229 laravel]$ php -v PHP 7.4.22 (cli) (built: Jul 27 2021 18:08:31) ( NTS ) Copyright (c) The PHP Group Zend Engine v3.4.0, Copyright (c) Zend Technologies php74-php-pdoをインストールすればいいのです。 [ec2-user@ip-172-31-39-229 laravel]$ sudo yum install -y php74-php-pdo 以上です。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【PHP】配列同士を結合する。配列にカラムを追加する

<?php $rows = [ 0 => [ 'id' => 10, 'language' => 'PHP', 'framework' => 'Laravel'], 1 => [ 'id' => 20, 'language' => 'Java', 'framework' => 'Spring'], 2 => [ 'id' => 30, 'language' => 'JavaScript', 'framework' => 'Vue.js' ], 3 => [ 'id' => 40, 'language' => 'Ruby', 'framework' => 'Ruby on Rails' ] ]; $add = [ 0 => [ 'id' => 10, 'age' => '1995年06月08日' ], 1 => [ 'id' => 20, 'age' => '2009年05月23日' ], 2 => [ 'id' => 30, 'age' => '2006年08月26日' ], 3 => [ 'id' => 40, 'age' => '1993年02月24日' ] ]; $start = hrtime(true); // 計測開始時間 $cnt = 0; foreach($rows as $row ){ $result[] = array_merge($row,['age' => $add[$cnt]['age']]); $cnt++; }; $end = hrtime(true); echo '処理時間:'.($end - $start).'ナノ秒'; var_dump($result); ?> <?php $rows = [ 0 => [ 'id' => 10, 'language' => 'PHP', 'framework' => 'Laravel'], 1 => [ 'id' => 20, 'language' => 'Java', 'framework' => 'Spring'], 2 => [ 'id' => 30, 'language' => 'JavaScript', 'framework' => 'Vue.js' ], 3 => [ 'id' => 40, 'language' => 'Ruby', 'framework' => 'Ruby on Rails' ] ]; $add = [ 30 => [ 'age' => '2006年08月26日' ], 40 => [ 'age' => '1993年02月24日' ], 10 => [ 'age' => '1995年06月08日' ], 20 => [ 'age' => '2009年05月23日' ] ]; foreach($rows as $row ){ if(!(empty($add[$row['id']]))){ $result[] = $row + $add[$row['id']]; }; }; var_dump($result); ?> array(4) { [0]=> array(4) { ["id"]=> int(10) ["language"]=> string(3) "PHP" ["framework"]=> string(7) "Laravel" ["age"]=> string(17) "1995年06月08日" } [1]=> array(4) { ["id"]=> int(20) ["language"]=> string(4) "Java" ["framework"]=> string(6) "Spring" ["age"]=> string(17) "2009年05月23日" } [2]=> array(4) { ["id"]=> int(30) ["language"]=> string(10) "JavaScript" ["framework"]=> string(6) "Vue.js" ["age"]=> string(17) "2006年08月26日" } [3]=> array(4) { ["id"]=> int(40) ["language"]=> string(4) "Ruby" ["framework"]=> string(13) "Ruby on Rails" ["age"]=> string(17) "1993年02月24日" } }
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

LaravelでArtisanコマンド(コマンドライン(Command))処理のテストを書く

経緯 ・ Laravelにて、バッチ処理を書くにあたって、Commandで実装してgithub actionsで定期実行する形にしようと考えてバッチ処理実装 ・ テスト書いてないとかお前それ t_wadaの前でも。。。があるので、テストももちろん書く! ・ マニュアルにあるように https://readouble.com/laravel/8.x/ja/console-tests.html $this->artisan('testBatch') ->expectsOutput('batch complete') ->assertExitCode(0); と書く。 ・ おーいけてるいけてる。じゃあDBの値の変更結果も確認しよう。 $this->artisan('testBatch') ->expectsOutput('batch complete') ->assertExitCode(0); $this->assertEquals(Hoge::count(), 1); FAILURES! testBatchの中で1行レコードが追加されるはずなのに何で!?!?!? 結論 run()で処理を明示的に実行させないとダメだった。 修正後 $this->artisan('testBatch') ->expectsOutput('batch complete') ->assertExitCode(0) ->run(); $this->assertEquals(Hoge::count(), 1); run()の記述が無い場合、プログラムの最後でrun()が実行されるようで、command処理実行後の値を取得、アサーションする場合は明示的にrun()を呼び出す必要があるみたい。 参考 ・PendingCommandの__destruct()でrun()が実行される。 https://github.com/laravel/framework/blob/8.x/src/Illuminate/Testing/PendingCommand.php#L361 ・execute()はrun()のエイリアス https://github.com/laravel/framework/blob/8.x/src/Illuminate/Testing/PendingCommand.php#L200
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel】Routingがあっているはずなのに404となった場合の対処法

概要 ブランチ等を切り替えているうちに、Routing登録済みのページで404となる現象が発生したためその時の対処法を記録 開発環境 Docker PHP 8.0.8 Laravel 8.32.1 対処法 正しいroutingが登録されていない可能性があるため、下記の手順で確認&修正します。 1.   登録されているroutingを確認 php artisan route:list 2. 404が出るページのrouting登録が1のリストで表示されない(または正しいものでない)場合、cacheを削除 php artisan route:clear 3. 再度1のコマンドを打ち、正しいroutingとなったことを確認して該当ページの表示確認を実施
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

久々にLaravelを触ったら、コンテナやフロントエンド開発が簡単になっていた

最近、ちょっと時間ができたのでキャッチアップのために Laravel8を触ってみました。 知識がLaravel5前後で止まっていたので、進化したエコシステムに驚いたので書き記しておきます。 ちなみに、次のLTSはLaravel9(2022/1/25リリース予定)になるので、この手の機能をプロダクションで使うときは、しかるべき時にアップデートをしましょう。 コンテナを使っての開発環境構築が楽になってる!(Laravel Sail) ちょっと前まではコンテナでLaravelを動かす時には自分で適当なDockerFileを書くか、Laradoc使って構築するケースが多かったと思います。 Laradockは大きくなりすぎて余計な機能もあったりしたので、私は自前でDockerFileを書く派でした。これだけでも、ちょっと「面倒くさいな。。。」なんて思っていました。 ここでLaravel Sailの登場です。 Sailを使っての環境構築は、 $ curl -s "https://laravel.build/[ディレクトリ名]" | bash $ cd [ディレクトリ名] # バックグラウンドで動かすなら、-dを付ければ OK # 下記の様にaliasを設定しておくとsailコマンドを使うのが簡単になる # alias sail='bash vendor/bin/sail' $ ./vendor/bin/sail up たったこれだけで、PHP + MySql + mailhog + redis + selenium を使ったプロジェクトが立ち上がります。 seleniumはブラウザテストの時なんかに便利ですね。 # 立ち上げたときの表示 $ sail up -d lara-sample_laravel.test_1 start-container Exit 255 0.0.0.0:80->80/tcp,:::80->80/tcp, 8000/tcp Shutting down old Sail processes... Creating network "lara-sample_sail" with driver "bridge" Creating lara-sample_mysql_1 ... done Creating lara-sample_selenium_1 ... done Creating lara-sample_mailhog_1 ... done Creating lara-sample_meilisearch_1 ... done Creating lara-sample_redis_1 ... done Creating lara-sample_laravel.test_1 ... done ちなみに、 sail artisan sail:publish でDockerFileなどが編集できる様になるので、独自のPHP拡張などを入れるのも簡単ですね React(Vueも)+認証の構築が楽になってる!(Laravel Breeze) とりあえず、Sailを使ってプロジェクトが動かせる様になったら認証を作って行きます。 元々はlaravel/uiがあったのですが、こちらか Jetstreamを使っていく方針の様です。 細かな認証の組み込みが不要な場合や初学者にはBreezeがお薦めですね。 認証をReactやVueで作っていくためには、 php artisan breeze:install vue # Vueの場合はこちら php artisan breeze:install react npm install npm run dev php artisan migrate で導入が可能です。ただ、初期インストール時に作成されるのはJavaScriptになるのでTypeScriptを使う時には下記の修正が必要です。 * webpack.mix.jsの修正 * tsconfig.jsonの作成 * resources/js配下のTypeScript化 下記の様にオプションをつけられる様になったら、もっと楽になると思っています。 # こちらはできません! php artisan breeze:install react --typescript ただ、非公式ですがBreeze + React + TypeScriptのGitHubリポジトリがあるので問題なく対処できるのではないでしょうか。 inertia.jsの衝撃(modern monolithとの出会い) Breezeを使ったReactの導入にはinertia.jsが使われています。 Build single-page apps, without building an API.(SPAをAPIを使うことなく構築できる) ということで、Reactを使ったSPAのルーティング、サーバサイドとのデータの受け渡しなどをbladeと同じ様な感覚で行うことができる様になっています。 おなじみのroutes/web.phpのルーティング情報を使えるのので、メンテナンスを行う上で非常に楽になると思います。 (下記は会員登録画面のサンプル。post(route('register'));が、そこに該当します。LaravelからはProps経由で値を受け取れています。) import Button from '@/Components/Button'; import Guest from '@/Layouts/Guest'; import Input from '@/Components/Input'; import Label from '@/Components/Label'; import React, { useEffect } from 'react'; import ValidationErrors from '@/Components/ValidationErrors'; import { InertiaLink } from '@inertiajs/inertia-react'; import { useForm } from '@inertiajs/inertia-react'; import route from 'ziggy-js'; type Props = { element1: string } export default function Register({ element1 }: Props) { const { data, setData, post, processing, errors, reset } = useForm({ name: '', email: '', password: '', password_confirmation: '', }); useEffect(() => { return () => { reset('password', 'password_confirmation'); }; }, []); const onHandleChange = (event: React.ChangeEvent<HTMLInputElement>) => { setData(event.target.name as "name" | "email" | "password" | "password_confirmation", event.target.type === 'checkbox' ? event.target.checked + '' : event.target.value); }; const submit = (e: React.SyntheticEvent) => { e.preventDefault(); post(route('register')); }; return ( <Guest> <ValidationErrors errors={errors} /> <form onSubmit={submit}> <div> <Label forInput="name" value="Name" /> {element1} <Input type="text" name="name" value={data.name} className="mt-1 block w-full" autoComplete="name" isFocused={true} handleChange={onHandleChange} required /> </div> <div className="mt-4"> <Label forInput="email" value="Email" /> <Input type="email" name="email" value={data.email} className="mt-1 block w-full" autoComplete="username" handleChange={onHandleChange} required /> </div> <div className="mt-4"> <Label forInput="password" value="Password" /> <Input type="password" name="password" value={data.password} className="mt-1 block w-full" autoComplete="new-password" handleChange={onHandleChange} required /> </div> <div className="mt-4"> <Label forInput="password_confirmation" value="Confirm Password" /> <Input type="password" name="password_confirmation" value={data.password_confirmation} className="mt-1 block w-full" handleChange={onHandleChange} required /> </div> <div className="flex items-center justify-end mt-4"> <InertiaLink href={route('login')} className="underline text-sm text-gray-600 hover:text-gray-900"> Already registered? </InertiaLink> <Button className="ml-4" processing={processing}> Register </Button> </div> </form> </Guest> ); } フロントエンドとサーバサイドを分業せずに開発しているプロダクトなどでは非常に有用に思います。 他にもリリースノートを見ると Models Directoryの導入(結局作るんかい!と思いましたが) Migration Squashing(マイグレーションを圧縮してディレクトリの肥大化を防ぐ) などなど、面白そうな機能がたくさんありました! わずか1年強、キャッチアップから離れていただけなのですが進化の速さに驚かされます。 勉強は続けないといけないですね。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravelでログイン機能を入れる

1 アプリのバックアップをしておく 2 認証機能をインストールする 1 Laravel/ulパッケージをインストールする ターミナル アプリ$composer require laravel/ui 2 パッケージを用いて認証機能を追加する ターミナル アプリ$php artisan ui vue --auth ターミナル(結果) アプリ$do you want~ *ここはyesにする! 3.CSSを適用させる ターミナル アプリ$npm run dev →完成!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

TravisCIでLaravel用パッケージを複数のLaravelバージョンで自動テストする

概要 Testing Laravel Package Against Multiple Laravel Versions. Laravel用のパッケージを開発する際に、Travisを利用して複数のLaravelバージョンでテストを回すための設定ファイル.travis.yml について。 (検索のワードが良くないのか、イマイチ日本語の情報が出てこなかったので残しておく。) 主要な目的 Laravel用パッケージに対する自動テストをTravisで回す ※Laravel本体を使ったアプリケーションのテストではなく、パッケージのテストである点に注意 php、Laravelの各バージョンを組み合わせてのテストを回す ※本稿ではPHP7.2~7.4、Laravel6~8を対象とする 結論 language: php matrix: include: - php: '7.2' env: 'ORCHESTRA_VERSION=4.*' - php: '7.2' env: 'ORCHESTRA_VERSION=5.*' - php: '7.3' env: 'ORCHESTRA_VERSION=6.*' - php: '7.4' env: 'ORCHESTRA_VERSION=6.*' install: - 'composer config github-oauth.github.com ${GH_TOKEN};' - 'composer remove --dev --no-update orchestra/testbench' - 'composer require --dev --prefer-dist --no-interaction orchestra/testbench $ORCHESTRA_VERSION' - 'composer install' script: 'vendor/bin/phpunit' 本論 orchestral/testbench のバージョンについて Laravel用パッケージのテストについては、https://github.com/orchestral/testbench の利用がスタンダードであるので、これを利用する。まず、Laravel5.5以降のバージョンとorchestral/testbenchバージョンの対応について整理する。 orchestral/testbench Laravel PHP 備考 3.5 5.5 7.0 3.6 5.6 7.1 3.7 5.7 7.1 3.8 5.8 7.1 3.9 6.0 7.2 4.0 6.0 7.2 Laravelが6系からセマンティックバージョンを採用したためと思われる 4.* 6.* 7.2 5.* 7.* 7.2.5 Laravel7系はPHP7.2.5以上 6.* 8.* 7.3 7.* 9.* 8.0 testbench、Laravelともにdev(2021-08-01現在) Travisのテスト設定は、上記に基づいて考えていけばよい。 複数バージョンテストのためのcomposer.json Travisのためにcomposer.json を色々といじりまわすのは面倒なので、とりあえずrequire-dev の項目のバージョン指定を曖昧(*)にしておく。 "require-dev": { "phpunit/phpunit": "*", "mockery/mockery": "*", "vimeo/psalm": "*", "infection/infection": "*", "maglnet/composer-require-checker": "*", "slevomat/coding-standard": "*", "squizlabs/php_codesniffer": "*", "jakub-onderka/php-parallel-lint": "*", "orchestra/testbench": "*", "phpmetrics/phpmetrics": "*", "pdepend/pdepend": "*" }, こんな感じ。これで、基本的にはビルドした環境で使えるものが入るはず。 複数バージョンテストのための.travis.yml バージョン対応表に基づいて、使用するPHPバージョン、testbenchのバージョンを設定ファイルに書いていく。下記の要領。 matrix: include: - php: '7.2' env: 'ORCHESTRA_VERSION=4.*' - php: '7.2' env: 'ORCHESTRA_VERSION=5.*' - php: '7.3' env: 'ORCHESTRA_VERSION=6.*' - php: '7.4' env: 'ORCHESTRA_VERSION=6.*' 次に、リポジトリに同梱してあるcomposer.jsonの内容をテストのために必要最低限だけ書き換える。 今回は、orchestra/testbench のバージョンだけ明示的にコントロールしたいので install: - 'composer remove --dev --no-update orchestra/testbench' - 'composer require --dev --prefer-dist --no-interaction orchestra/testbench $ORCHESTRA_VERSION' - 'composer install' こんな感じ。composer.json に書いてある orchestra/testbench を一旦削除して、明示的にバージョンを指定する。 最後に、composerでinstallした、ビルド環境にあっているphpunitを叩く必要があるので、 script: 'vendor/bin/phpunit' こう。 所感 .travis.yml については、試行錯誤しながら実施したら結構すんなり行けた。過去に、複数のPHPバージョンでテストを回したことがある人なら、特に困る箇所は無いだろうと思う。 TravisCIの画面から環境変数追加できるの知らなかった・・・ めちゃ便利やん トラブルシューティング 発生したトラブルとしては主に以下の3点。 おそい(PHP7.2以下の環境だとビルドが遅い。) =>未解決、しょうがない気がする Laravel5系で、テストが失敗する(App::makePartial() が定義されていない、というエラー) =>一応解決(Laravel5系は対応バージョンから外した) composer require 時にgithubから怒られる(Could not authenticate against github.com ) =>解決(personal token 使いましょう) 参考URL Laravel Package Development: Testing Against Multiple Laravel Versions https://medium.com/homesteading-like-an-artisan/laravel-package-development-testing-against-multiple-laravel-versions-3485cb5762e2 Testing Laravel packages for backward compatibility using Travis https://medium.com/@remi_collin/testing-laravel-packages-for-backward-compatibility-using-travis-cabc3210e120 orchestral / testbench https://github.com/orchestral/testbench Github auth token on TravisCI https://blog.wyrihaximus.net/2015/09/github-auth-token-on-travis/ api-rate-limit-and-oauth-tokens https://getcomposer.org/doc/articles/troubleshooting.md#api-rate-limit-and-oauth-tokens
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む