20210730のlaravelに関する記事は5件です。

Laravelから受け取ったデータをVueで非同期で更新する。

はじめに LaravelからVueにデータを渡すときのメモを大まかに書いておきます。 環境 Laravel 8.33.1 vue: 2.5.17 api.phpに書くのが正しいのかweb.phpに書くのがいいのかわからないのですが、どちらでも動く、違いといえばapi/をつけるかどうかくらいにしか理解できていないです。。 web.php Route::get('/', [ProductController::class,'index']); Route::get('/Products', [ProductController::class,'getProducts']); テーブル $table->id(); $table->string('name'); $table->string('description'); $table->timestamps(); Resourceをつくって必要なデータだけを取り出します。 php artisan make:resource ProductResource Resourceを書き換え。timestampsは必要ないので取り除いてる。 public function toArray($request) { return [ 'id' => $this->id, 'name' => $this->word, 'description' => $this->description, ]; //デフォルト↓ // return parent::toArray($request); } ProductController //useを追加 use App\Models\Product; use App\Http\Resources\ProductResource; //viewを返す public function index() { return view('index'); } //Vueにデータを渡す public function getProducts() { return ProductResource::collection(Product::all()); } View。appで囲む。script を忘れずに書く <div id="app"> <product-page/> </div> <script src="{{ asset('js/app.js') }}"></script> Laravelからのデータをaxiosで受け取る。受け取ったデータを空の配列のproductsに入れる。for文で回す <template> <div > <p v-for="product in products" :key='product.id'> {{ product.name}}     {{ product.description}} </p> </div> </template> <script> export default { data: function () { return { products: [], }; }, mounted() { this.loadEnglishWord(); }, methods: { //Laravelからのデータをaxiosで受け取る loadProducts: function () { axios .get("/products") .then((response) => { // console.log( response) this.products= response.data.data; }) .catch(function (error) { console.log(error); }); }, }, }; </script>
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

mixhostでLaravelアプリをデプロイした時のメモ

mixhostはPHPに対応しているWebサーバーであるのでLaravlやWordpressのアプリケーションを公開することができる。今回はLaravelアプリを公開してみた。 フロー 1.サブドメインの作成 2.Gitcloneでプロジェクトをインポートする 3.composer install 4..envの記述の変更 5.マイグレーション 6.シンボリックリンクの作成 サブドメインの作成 mixhostのCパネルからサブドメインを作成する。 名前は公開したいLaravelのアプリケーション名なるようにする。 Gitcloneでプロジェクトをインポートする SSH接続で該当のmixhostサーバーに接続する。 その後、cd public_html で公開ディレクトリにアクセスする。 そのディレクトリでgit cloneでプロジェクトをインポートした。 作成したサブドメインにアクセスして、Laravelのアプリケーションにアクセスするようにしたいのでmvコマンドでディレクトリの名前を変更した。 なお、サブドメインを作成した際に自動でsubdomainというディレクトリが作成されるので削除するか名前を変更しておくのが良い。 e.g.)Laravelのアプリケーションがtestapp、作成したサブドメインがsubdomainの時 $mv testapp subdomain composer install 該当のLaravelプロジェクト上で composer install を行い、Laravelに必要なファイルやライブラリを本番環境のアプリケーションにインポートする。 この際、レンタルサーバーのPHPのバージョンやcomposerをインストールしていない場合はできない可能性があるので気をつける必要がある。 .envの記述の変更 本番環境用のデータベースに接続するために.envの記述を変更する必要がある。 なお、本番環境のDBにマイグレーションするので、あらかじめレンタルサーバー側でデータベースを作成していく必要がある。 作成後、.envの記述を変更する準備をする。 gitにpushしたLaravelのプロジェクトでは.gitignoreファイル関係上.envはプロジェクト上に存在しないのでcpコマンドでenv.exampleから複製して作成する。 cp .env.example .env その後、viコマンドで.envの記述を変更する。 APP_NAME=test-app APP_ENV=production APP_KEY= APP_DEBUG=false APP_URL=https://test-app.test.com LOG_CHANNEL=stack DB_CONNECTION=mysql DB_HOST=localhost DB_PORT=3306 DB_DATABASE=DB名 DB_USERNAME=DBユーザー名 DB_PASSWORD=DBパスワード 次に。artisanコマンドでAPP_KEYを作成する。 $ php artisan key:generate キャッシュコマンドで.envの変更を修正することを忘れないようにしてほしい。 マイグレーション DBの準備ができたのでマイグレーションを行う。 $ php artisan migrate これで本番環境にも利用したいテーブルが反映される。 必要であればダミーデータをシーダーやファクトリから挿入する。 シンボリックリンクの作成 このまま作成したサブドメインのURLにアクセスしても目的のLaravelのアプリケーションを起動できないので、シンボリックリンクを作成する必要がある。 In -s リンク元のパス リンク先のパス のように記述する。 e.g)honbanドメインにサブドメインとしてsubdomainを作成した。そこに対して、相対パスでLaravelのpublicディレクトリへとシンボリックリンクを作成した。 $ ln -s ~/public_html/subdomain.honban.com /home/testuser/public_html/subdomain/public これでシンボリックリンクも作成できて、実際のサブドメインにアクセスしてもLaravelのアプリケーションを公開することができた。 参考
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

定期的にモデル削除のPrunable機能到着 [Laravel 8.50]

概念 定期的に不要になったレコードをDBから物理的に削除したい場合があるとおもいます。今までこの処理をバッチやコマンドで作る必要がありましたがLaravel 8.50のリリースに含んでいるPrunableかMassPrunableのトレイトをモデルクラスに追加することで、この処理が簡単に実装できます。 セットアップ 変更履歴のログや調査のため、ユーザーの名前などの情報が変更されるときにDBのUserLogのテーブルに保存する事を例とします。UserLog情報を6ヶ月間保存する必要があり、定期的に6ヶ月間前のレコードをDBから物理的に削除します。 使い方 モデルの周り モデルにPrunableのトレイトを追加して、prunableの関数に削除対象のレコードをEloquentのクエリビルダで返す機能を実装します。PrunableとMassPrunableを使うとき論理削除のSoftDeletesを利用しているモデルでもクエリに一致した場合、物理的にforceDelete()で削除されますので気を付けてください。 <?php namespace App\Models; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Prunable; class UserLog extends Model { use Prunable; /** * 削除対処のモデルを取得 * * @return \Illuminate\Database\Eloquent\Builder */ public function prunable() { // 6ヶ月前のレコードを取得する return static::where('created_at', '<=', now()->subMonths(6)); } } もしそのモデルと関連する処理(たとえば、古いプロファイルの写真を削除することや、関連するモデル削除など)が必要な場合、モデルが削除する前にpruningという関数で処理が実装できます。 /** * モデルの削除の準備 * * @return void */ protected function pruning() { // ここでモデルが削除する前に必要な処理を実装します } スケジュール Prunableを利用しているモデルの削除処理が行われるため、アプリケーションのApp\Console\Kernelクラスでmodel:pruneのArtisanコマンドを登録する必要があります。そのコマンドが実行されるとapp/Modelsディレクトリ内にあるPrunable とMassPrunableを利用しているモデルの削除処理が行われます。もしモデルが別のダイレクトリーにあるなら、--modelのオプションを使って、モデルのクラス名を配列として指定できます。下記の例だと毎日の03:00に削除処理が実行されます。 App\Console\Kernel.php protected function schedule(Schedule $schedule) { // `app/Models`ディレクトリ内の場合 $schedule->command('model:prune') ->daily() ->at('03:00'); // `app/Models`ディレクトリ以外の場合 $schedule->command('model:prune', [ '--model' => [UserLog::class], ])->daily() ->at('03:00'); } MassPrunable VS Prunable MassPrunableというのはの複数削除処理が行われ、Prunableと違って削除前にレコードを取得せず、複数レコード削除クエリが実行されます。そのためMassPrunableの方がPrunableより、処理が効率的です。しかし、削除する前にレコードが取得されないため、Eloquentのdeleted・deleting・pruningのイベントは発火しません。それ以外は、Prunableの実装と同じです。 <?php namespace App\Models; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\MassPrunable; class UserLog extends Model { use MassPrunable; /** * 削除対処のモデルを取得 * * @return \Illuminate\Database\Eloquent\Builder */ public function prunable() { // 6ヶ月前のレコードを取得する return static::where('created_at', '<=', now()->subMonths(6)); } /** * モデルの削除の準備 * * @return void */ protected function pruning() { // イベントが発生されないので、この関数の処理が行われない } } 参考 https://github.com/laravel/framework/pull/37696 https://laravel.com/docs/8.x/eloquent#pruning-models https://laravel.com/api/8.x/Illuminate/Database/Eloquent/Prunable.html https://laravel.com/api/8.x/Illuminate/Database/Eloquent/MassPrunable.html
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Laravel8.x]API ResourceでCollectionに特定のResourceクラスを指定する方法

公式ドキュメント Laravel 8.x Eloquent:APIリソース やりたいこと API ResourceのCollectionで特定Resourceでパスワードなど不要な情報やEnumを文字列変換したデータを取得したい。 公式にはやり方が記載されていなかったので、実装例を残しておきます。 Collectionの取得したいデータイメージ { "data": [ { "id": 1, "name": "佐々木", "status": "本登録", }, { "id": 2, "name": "嘉納", "status": "退会", }, { "id": 3, "name": "亜門", "status": "仮登録", }, ], "count": 3, "statuses": {"1": "仮登録", "2": "本登録", "3": "退会"} } サンプルコード Collectionクラス 実装する時のポイント デフォルトだと$this->collectionとなっている。 指定したいResourceクラスのcollectionを使って呼び出す。 UserResource::collection($this->collection) UserCollection namespace App\Http\Resources; use Illuminate\Http\Resources\Json\ResourceCollection; class UserCollection extends ResourceCollection { /** * Transform the resource collection into an array. * * @param \Illuminate\Http\Request $request * @return array */ public function toArray($request) { return [ 'data' => UserResource::collection($this->collection), 'count' => $this->collection->count(), 'statuses' => UserStatusEnum::values(), ]; } } Resourceクラス 実装する時のポイント $this->パラメータ名を指定して値が取得できます。 コード値の文字列変換や、必要なパラメータのみを定義することが出来ます。 UserResource namespace App\Http\Resources; use Illuminate\Http\Resources\Json\JsonResource; class UserResource extends JsonResource { /** * Transform the resource into an array. * * @param \Illuminate\Http\Request $request * @return array */ public function toArray($request) { return [ 'id' => $this->id, 'name' => $this->name, 'status' => UserStatusEnum::description($this->status), ]; } }
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravelでinput,select,checkboxの値を取得する方法

input view <input name="name" value="hoge"> controller public function namae(Request $request) { $name = $request->input('name'); echo $name; } //出力結果  //hoge select view <select name="age"> <option value="20" selected>20歳</option> <option value="30">30歳</option> </select> controller public function nenrei(Request $request) { $age = $request->age; echo $age; } //出力結果 //20 checkbox view <input type="checkbox" name="color[]" value="red" checked> <input type="checkbox" name="color[]" value="yellow" checked> <input type="checkbox" name="color[]" value="green"> name属性にカッコをつけてあげます。カッコつけないと値が1つしか入りません。 controller public function iro(Request $request) { $colors = $request->input('color'); //このとき$colorsは配列になっています。 foreach($colors as $color){ echo $color."\n"; } } //出力結果 //red //yellow
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む