【laravel】HasFactoryとは?vender|illuminateが無い

最終更新日

この記事では、laravel8以上でモデルを作ったときにデフォルトで記述されているHasFactoryとは?vender|illuminateが無いについてまとめました。

HasFactoryとは

モデルファクトリはEloquentモデルの各フィールドに入る値を定義します。
モデルの工場といったところです。

主にシーダーやテストコードからモデルファクトリーは呼び出されます。

https://qiita.com/ucan-lab/items/788d1a603f2b53ebb999

https://readouble.com/laravel/9.x/ja/database-testing.html?header=Model%2520&%2520Factory%2520Discovery%2520Conventions%25E3%2583%25A2%25E3%2583%2587%25E3%2583%25AB%25E3%2581%25A8%25E3%2583%2595%25E3%2582%25A1%25E3%2582%25AF%25E3%2583%2588%25E3%2583%25AA%25E3%2581%25AE

モデルを作ってみる

とりあえず、HasFactoryを見るためにモデルを作ってみます。

php artisan make:model ファイル名

作った直後、ファイルを見ると「HasFactory」と表記されていました。

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Form extends Model
{
    use HasFactory;
}

Hasfactoryの場所

Hasfactoryのディレクトリは、

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

Illuminate\Database\Eloquent\Factories\HasFactory;

この階層にあるみたいです。

illuminateファイルの場所

illuminateファイルへアクセスするには、プロジェクトを作成したときに自動的に生成されるvenderファイルにあるようです。

vender > laravel > framework > src > Illuminate

venderファイルがない

laravelで、venderファイルが表示されないことがあります。色々調べたけど変更されたりしないように表示されないみたいです。

ただ、本番環境では

comporser install

を行い、appディレクトリに取得する必要がある

これらのファイルは、ルートディレクトリ直下の「vendor > laravel > framework > src > Illuminate配下」に保存されている。

このvendorディレクトリはgitに認識されないように、「.gitignore」ファイルに記載されている。

/node_modules
/public/hot
/public/storage
/storage/*.key
/vendor
.env
.env.backup
.phpunit.result.cache
docker-compose.override.yml
Homestead.json
Homestead.yaml
npm-debug.log
yarn-error.log

VSCodeはデフォルトでは、.gitignoreや.ignoreファイルに含まれているディレクトリやファイルを検索結果に含まない設定になっている。検索にヒットしないのはこのため。

ちなみに、.gitignoreの記述ルールは、ディレクトリ名を記述した場合は、その配下もgitから除外する。

https://prograshi.com/framework/laravel/vscode-find-vendor-illuminate/

vendorフォルダの中のライブラリファイルは、編集できません。

  • vendorディレクトリの中にはライブラリが入っている
  • ローカル上でvendorディレクトリの中を編集しても、本番環境に反映されない
  • そのため、オーバーライドを行う。大雑把にいうと、vendorの中の書きかえたい部分をappディレクトリの下にもってきて編集する。
  • 本番環境では composer installコマンドを行って、ライブラリをインストールする
https://biz.addisteria.com/laravel_vendor

HasFactoryの中身について解説

HasFactoryの中身について解説します。

<!-- wp:codemirror-blocks/code-block {"mode":"php","mime":"text/x-php"} -->
<div class="wp-block-codemirror-blocks-code-block code-block"><pre>&lt;?php

namespace Illuminate\Database\Eloquent\Factories;

trait HasFactory
{
    /**
     * Get a new factory instance for the model.
     *
     * @param  callable|array|int|null  $count
     * @param  callable|array  $state
     * @return \Illuminate\Database\Eloquent\Factories\Factory&lt;static&gt;
     */
    public static function factory($count = null, $state = [])
    {
        $factory = static::newFactory() ?: Factory::factoryForModel(get_called_class());

        return $factory
                    ->count(is_numeric($count) ? $count : null)
                    ->state(is_callable($count) || is_array($count) ? $count : $state);
    }

    /**
     * Create a new factory instance for the model.
     *
     * @return \Illuminate\Database\Eloquent\Factories\Factory&lt;static&gt;
     */
    protected static function newFactory()
    {
        //
    }
}
</pre></div>
<!-- /wp:codemirror-blocks/code-block -->
  1. trait

①traitとは

traitとは、PHPのバージョン5.4.0から導入されたコードを再利用しやすくする機能です。

トレイトは、PHP のような単一継承言語でコードを再利用するための仕組みのひとつです。 トレイトは、単一継承の制約を減らすために作られたもので、 いくつかのメソッド群を異なるクラス階層にある独立したクラスで再利用できるようにします。 トレイトとクラスを組み合わせた構文は複雑さを軽減させてくれ、 多重継承や Mixin に関連するありがちな問題を回避することもできます。 https://www.php.net/manual/ja/language.oop5.traits.php

traitの使い方

traitの定義
trait トレイト名 {
    function メソッド名①() {
        処理
    }

    function メソッド名②() {
        処理
    }
}
traitの利用
class クラス名 {
    use トレイト名;
}

つまり、traitを利用するためモデルに

uae HasFactory;

があるわけです。

余談

公式マニュアルに出てくる

parent

が疑問に思われたらこちらを参照してください。簡単に説明すると、親クラスのプロパティへアクセスするためのキーワードです。

その他の参考

https://qiita.com/ucan-lab/items/788d1a603f2b53ebb999

https://ja.m.wikipedia.org/wiki/Factory_Method_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3