検索

Ardent: Laravel Models on Steroids

ARDENT:ステロイドのLaravelモデル

私がLaravelについて気に入らない(少数の)ことの1つは、検証コードをコントローラーからモデルに簡単に移動できないことです。ソフトウェアを書くとき、私は「脂肪モデル、スキニーコントローラー」の原則を適用するのが好きです。ですから、私にとって、コントローラーに検証コードを書くことは良いことではありません。 これを解決するために、Laravel 4の素晴らしいパッケージであるArdentを紹介したいと思います。より正確には、Ardentは「Laravel Framework 4のEloquent ORMの自己検証スマートモデル」として現れます。言い換えれば、正確に必要なもの!

ご想像のとおり、基本的には雄弁なモデルクラスの拡張です。このパッケージには、入力検証などの新しい機能、ユーティリティ、およびメソッドが付属しています。

キーテイクアウト

強化された検証:ARDENTは、モデル内でルールを直接定義できるようにすることにより、検証プロセスを簡素化し、特に大規模なプロジェクトでコード組織と保守性を向上させます。
    モデルの自動hydrate:この機能は、フォーム入力からモデル属性を自動的に入力し、コントローラーのボイラープレートコードを削減し、コードベースのクリーナーをより効率的にする。
  • モデルフック:ARDENTは、保存、更新、削除、削除などの特定のライフサイクルモーメントで実行されるメソッドであるモデルフックを導入し、データハンドリングをより強く制御します。
  • 単純化された関係:モデル関係を定義することは、単純な配列構造( `$ lelationsData`)を使用して、熱心でより合理化されており、Laravelモデルの関係管理の複雑さを減らします。
  • 自動パージ冗長データ:ARDENTは、確認フィールドやCSRFトークンなどの入力から不要なデータを自動的に破棄し、関連するデータのみが処理および保存されるようにします。
  • 私たちのテストアプリケーション
  • Ardentを使用している間に楽しむことができる利点をよりよく理解するために、少しテストアプリケーションを設定します。複雑なものは何もありません:シンプルなTo Doリストアプリ。
  • もちろん、私は完全なアプリケーションを実装するつもりはありません。いくつかの原則を説明したいので、いくつかのコントローラーとモデルを作成します。ビューはありません。その後、Ardentを使用してコードを「翻訳」します
  • To Doリストは、2つの異なるエンティティをカウントします:

ユーザー

id

first_name

    last_name
  • メール

      パスワード
    • タスク
    • id
    • name
  • ステータス(完了 /完了)
    • 本当に基本的なプロジェクト。ただし、コードを作成したくない場合は、心配しないでください。データベースの生成に使用できる移行をすでに準備しています。使用!
    • コマンドを使用して移行ファイルを作成します
    • そして、このコードでファイルを入力してください:
    • php artisan migrate:make todo_setup

      テーブルがあります。モデルを作成する時が来ました。ここでも、書くべき行はほとんどありません。これがユーザーモデルです(これもデフォルトのモデルです)。

      <span><span><?php </span></span><span>
      </span><span>    <span>use Illuminate<span>\Database\Schema\Blueprint</span>;
      </span></span><span>    <span>use Illuminate<span>\Database\Migrations\Migration</span>;
      </span></span><span>
      </span><span>    <span>class TodoSetup extends Migration {
      </span></span><span>
      </span><span>        <span>/**
      </span></span><span><span>         * Run the migrations.
      </span></span><span><span>         *
      </span></span><span><span>         * <span>@return <span>void</span>
      </span></span></span><span><span>         */
      </span></span><span>        <span>public function up()
      </span></span><span>        <span>{
      </span></span><span>            <span>Schema<span>::</span>create('users', function(Blueprint $table)
      </span></span><span>            <span>{
      </span></span><span>                <span>$table->increments('id')->unsigned();
      </span></span><span>
      </span><span>                <span>$table->string('first_name');
      </span></span><span>                <span>$table->string('last_name');
      </span></span><span>                <span>$table->string('email');
      </span></span><span>                <span>$table->string('password', 60);
      </span></span><span>
      </span><span>                <span>$table->timestamps();
      </span></span><span>            <span>});
      </span></span><span>
      </span><span>            <span>Schema<span>::</span>create('tasks', function(Blueprint $table)
      </span></span><span>            <span>{
      </span></span><span>                <span>$table->increments('id');
      </span></span><span>
      </span><span>                <span>$table->string('name');
      </span></span><span>                <span>$table->boolean('status');
      </span></span><span>
      </span><span>                <span>$table->integer('user_id')->unsigned();
      </span></span><span>
      </span><span>                <span>$table->timestamps();
      </span></span><span>
      </span><span>                <span>$table->index('user_id');
      </span></span><span>            <span>});
      </span></span><span>        <span>}
      </span></span><span>
      </span><span>        <span>/**
      </span></span><span><span>         * Reverse the migrations.
      </span></span><span><span>         *
      </span></span><span><span>         * <span>@return <span>void</span>
      </span></span></span><span><span>         */
      </span></span><span>        <span>public function down()
      </span></span><span>        <span>{
      </span></span><span>            <span>Schema<span>::</span>dropIfExists('users');
      </span></span><span>            <span>Schema<span>::</span>dropIfExists('tasks');
      </span></span><span>        <span>}
      </span></span><span>
      </span><span>    <span>}</span></span></span>
      タスクモデルとの関係を説明するタスクメソッドを追加しました。

      出発点を作成しました。これからは、インストールの直後に、2つの異なる状況が表示されます。まず、熱心なコードの「通常の」バージョンです。その後、「改善」バージョンと比較します。あなたは違いに気づくでしょう、私を信じてください。
      <span><span><?php </span></span><span>
      </span><span>    <span>use Illuminate<span>\Auth\UserTrait</span>;
      </span></span><span>    <span>use Illuminate<span>\Auth\UserInterface</span>;
      </span></span><span>    <span>use Illuminate<span>\Auth\Reminders\RemindableTrait</span>;
      </span></span><span>    <span>use Illuminate<span>\Auth\Reminders\RemindableInterface</span>;
      </span></span><span>
      </span><span>    <span>class User extends Eloquent implements UserInterface, RemindableInterface {
      </span></span><span>
      </span><span>        <span>use UserTrait, RemindableTrait;
      </span></span><span>
      </span><span>        <span>/**
      </span></span><span><span>         * The database table used by the model.
      </span></span><span><span>         *
      </span></span><span><span>         * <span>@var <span>string</span>
      </span></span></span><span><span>         */
      </span></span><span>        <span>protected $table = 'users';
      </span></span><span>
      </span><span>        <span>/**
      </span></span><span><span>         * The attributes excluded from the model's JSON form.
      </span></span><span><span>         *
      </span></span><span><span>         * <span>@var <span>array</span>
      </span></span></span><span><span>         */
      </span></span><span>        <span>protected $hidden = array('password', 'remember_token');
      </span></span><span>
      </span><span>        <span>public function tasks()
      </span></span><span>        <span>{
      </span></span><span>            <span>return $this->hasMany('Task');
      </span></span><span>        <span>}
      </span></span><span>
      </span><span>    <span>}</span></span></span>

      始めましょう!

      Ardent

      のインストール

      ARDENTのインストールは、作曲家にとって非常に簡単です。プロジェクトのcomposer.jsonファイルに依存関係を追加するだけです。

      その後、更新後、モデルに熱心なクラスを拡張する必要があります。
      <span><span><?php </span></span><span>
      </span><span>    <span>class Task extends <span>\Eloquent</span> {
      </span></span><span>        <span>protected $fillable = [];
      </span></span><span>
      </span><span>        <span>public function user()
      </span></span><span>        <span>{
      </span></span><span>            <span>return $this->belongsTo('User');
      </span></span><span>        <span>}
      </span></span><span>    <span>}</span></span></span>

      …そして、あなたは行く準備ができています!

      <span>{
      </span>        <span>"require": {
      </span>            <span>"laravelbook/ardent": "2.*"
      </span>        <span>}
      </span>    <span>}</span>
      データ検証

      最初に行うことは、熱心がどのように検証の実装において私たちの生活を容易にするかを分析することです。 Laravelでそれを行う方法をすでに知っています。古典的な例を作成しましょう:フォームから入るデータを処理するPOSTメソッド。

      「通常」の状況では、次のようなものを作ります:

      …アーデントではどうですか?

      熱心で、物事は少し変わります。まず第一に、簡単に想像できるように、検証ルールはモデルに直接移動されます。「Restyle」を開始するのはここにあります。したがって、モデルファイルを開き、そのように変更してください:
      <span><span><?php </span></span><span>    <span>class User extends <span>\LaravelBook\Ardent\Ardent</span> {
      </span></span><span>        <span>// model code here!
      </span></span><span>    <span>}</span></span></span>

      何が起こったのですか?あまり:モデルのベースクラス(雄弁から熱心に)を変更し、ここで検証ルールをカスタムエラーメッセージで(同じ構文を使用して)移動しました。

      それで、今の質問は次のとおりです。コントローラーに何を書くつもりですか?

      <span><span><?php </span></span><span>
      </span><span>    <span>public function postSignup()
      </span></span><span>    <span>{
      </span></span><span>        <span>$rules = array(
      </span></span><span>            <span>'first_name' => 'required',
      </span></span><span>            <span>'last_name' => 'required',
      </span></span><span>            <span>'email' => 'required|email|unique:users',
      </span></span><span>            <span>'password' => 'required|min:8'
      </span></span><span>        <span>);
      </span></span><span>
      </span><span>        <span>$messages = array(
      </span></span><span>            <span>'first_name.required' => 'First name is required.',
      </span></span><span>            <span>'last_name.required' => 'Last name is required.',
      </span></span><span>            <span>'email.required' => 'Email is required.',
      </span></span><span>            <span>'password.required' => 'Password is required.',
      </span></span><span>
      </span><span>            <span>'email.email' => 'Use a real email address!',
      </span></span><span>            <span>'email.unique' => 'This email address already exists!',
      </span></span><span>            <span>'password.min' => 'Password must be at least 8 character long.'
      </span></span><span>        <span>);
      </span></span><span>
      </span><span>        <span>$validator = Validator<span>::</span>make(Input<span>::</span>all(), $rules, $messages);
      </span></span><span>
      </span><span>        <span>if($validator->fails())
      </span></span><span>        <span>{
      </span></span><span>            <span>return Redirect<span>::</span>to('user/signup')->with('errors', $validator->messages());
      </span></span><span>        <span>}
      </span></span><span>
      </span><span>        <span>$user = new User;
      </span></span><span>
      </span><span>        <span>$user->first_name = Input<span>::</span>get('first_name');
      </span></span><span>        <span>$user->last_name = Input<span>::</span>get('last_name');
      </span></span><span>        <span>$user->email = Input<span>::</span>get('email');
      </span></span><span>        <span>$user->password = Hash<span>::</span>make(Input<span>::</span>get('password'));
      </span></span><span>
      </span><span>        <span>if($user->save())
      </span></span><span>        <span>{
      </span></span><span>            <span>$status = 1;
      </span></span><span>        <span>}
      </span></span><span>        <span>else
      </span></span><span>        <span>{
      </span></span><span>            <span>$status = 0;
      </span></span><span>        <span>}
      </span></span><span>
      </span><span>        <span>return Redirect<span>::</span>to('user/signup')->with('status', $status);
      </span></span><span>    <span>}</span></span></span>
      チェックしてみましょう:

      ここにはこれ以上検証手順はありません。彼らはすべて姿を消した。ただし、「移動」だけではありません。$ user-> save()メソッドは、検証フェーズにいくつかの問題がある場合、falseを返します。次に、$ user-> errors() - > all()メソッドでエラーを取得できます。奇妙なクラスはありません:返されたオブジェクトは、Laravelで作業している間にすでに出会った可能性のある古典的なメッセージバッグです。

      ただし、必要に応じて、$ user-> balidationerrorsプロパティを使用することもできます。その場合、またはフィールド固有のエラーを取得する場合は、$ user-> balidationerrors-> get( 'field_name')を使用してください。

      さて、あなたは「OK、しかし、コードの行が少ないことを超えて、本当の利点は何ですか?」

      最も重要なことから始めましょう。コード組織を改善すると、プロジェクトの保守性が向上します。簡単なアプリケーションでは、優先事項とは感じられませんが、より大きなプロジェクトに関しては、1つの間違った決定を簡単に台無しにすることができます。現実世界の状況の例を作りましょう。私たちは素晴らしいToDoリストアプリケーションを開発しましたが、それは本当に急速に成長しています。モバイルアプリケーションには間違いなくRESTFUL APIが必要です。コントローラーを「通常」の方法で使用することは、APIの別のサインアップルーチンを書き込むことを意味します。同じコードを持つ2つの異なるブロック!これは良くありません。古き良き乾燥(自分自身を繰り返さないでください)の原則はどこですか?

      したがって、ベストプラクティスは、すべてを処理するモデルにsignup()メソッドを作成することです。 Ardentを使用すると、検証から保存手順まで、本当にすべてを処理することを意味します。それがなければ、最初のフェーズを達成することはできませんでした

      2番目の利点は、より実用的なものです。モデルオートhydrateです。一緒に発見しましょう。

      モデル自動hydrate

      postignup()メソッドは、正確に13行のコードをカウントします。たとえ難しいと思われたとしても、熱心はその数をさらに下げることができます。この例をご覧ください:

      php artisan migrate:make todo_setup
      ここにエラーはありません。あなたはおそらくすでに何が起こったのかをすでに理解しています。

      Ardentには、モデルの自動水和物機能があります。これは、オブジェクトを作成して$ user-> save()メソッドを呼び出すと、すべてのフィールドが入力オブジェクトデータで自動的に満たされることを意味します。もちろん、それに応じてすべてのフォームフィールドで正しい名前を付ける必要があります。

      したがって、このコード:

      <span><span><?php </span></span><span>
      </span><span>    <span>use Illuminate<span>\Database\Schema\Blueprint</span>;
      </span></span><span>    <span>use Illuminate<span>\Database\Migrations\Migration</span>;
      </span></span><span>
      </span><span>    <span>class TodoSetup extends Migration {
      </span></span><span>
      </span><span>        <span>/**
      </span></span><span><span>         * Run the migrations.
      </span></span><span><span>         *
      </span></span><span><span>         * <span>@return <span>void</span>
      </span></span></span><span><span>         */
      </span></span><span>        <span>public function up()
      </span></span><span>        <span>{
      </span></span><span>            <span>Schema<span>::</span>create('users', function(Blueprint $table)
      </span></span><span>            <span>{
      </span></span><span>                <span>$table->increments('id')->unsigned();
      </span></span><span>
      </span><span>                <span>$table->string('first_name');
      </span></span><span>                <span>$table->string('last_name');
      </span></span><span>                <span>$table->string('email');
      </span></span><span>                <span>$table->string('password', 60);
      </span></span><span>
      </span><span>                <span>$table->timestamps();
      </span></span><span>            <span>});
      </span></span><span>
      </span><span>            <span>Schema<span>::</span>create('tasks', function(Blueprint $table)
      </span></span><span>            <span>{
      </span></span><span>                <span>$table->increments('id');
      </span></span><span>
      </span><span>                <span>$table->string('name');
      </span></span><span>                <span>$table->boolean('status');
      </span></span><span>
      </span><span>                <span>$table->integer('user_id')->unsigned();
      </span></span><span>
      </span><span>                <span>$table->timestamps();
      </span></span><span>
      </span><span>                <span>$table->index('user_id');
      </span></span><span>            <span>});
      </span></span><span>        <span>}
      </span></span><span>
      </span><span>        <span>/**
      </span></span><span><span>         * Reverse the migrations.
      </span></span><span><span>         *
      </span></span><span><span>         * <span>@return <span>void</span>
      </span></span></span><span><span>         */
      </span></span><span>        <span>public function down()
      </span></span><span>        <span>{
      </span></span><span>            <span>Schema<span>::</span>dropIfExists('users');
      </span></span><span>            <span>Schema<span>::</span>dropIfExists('tasks');
      </span></span><span>        <span>}
      </span></span><span>
      </span><span>    <span>}</span></span></span>
      と同じ効果があります

      13行目から、サインアップ手順全体で7回に下ったばかりです。
      <span><span><?php </span></span><span>
      </span><span>    <span>use Illuminate<span>\Auth\UserTrait</span>;
      </span></span><span>    <span>use Illuminate<span>\Auth\UserInterface</span>;
      </span></span><span>    <span>use Illuminate<span>\Auth\Reminders\RemindableTrait</span>;
      </span></span><span>    <span>use Illuminate<span>\Auth\Reminders\RemindableInterface</span>;
      </span></span><span>
      </span><span>    <span>class User extends Eloquent implements UserInterface, RemindableInterface {
      </span></span><span>
      </span><span>        <span>use UserTrait, RemindableTrait;
      </span></span><span>
      </span><span>        <span>/**
      </span></span><span><span>         * The database table used by the model.
      </span></span><span><span>         *
      </span></span><span><span>         * <span>@var <span>string</span>
      </span></span></span><span><span>         */
      </span></span><span>        <span>protected $table = 'users';
      </span></span><span>
      </span><span>        <span>/**
      </span></span><span><span>         * The attributes excluded from the model's JSON form.
      </span></span><span><span>         *
      </span></span><span><span>         * <span>@var <span>array</span>
      </span></span></span><span><span>         */
      </span></span><span>        <span>protected $hidden = array('password', 'remember_token');
      </span></span><span>
      </span><span>        <span>public function tasks()
      </span></span><span>        <span>{
      </span></span><span>            <span>return $this->hasMany('Task');
      </span></span><span>        <span>}
      </span></span><span>
      </span><span>    <span>}</span></span></span>
      この機能を使用するには、アクティブ化する必要があります。このように、モデルの$ autohydrateEntityFromInputをTrueに切り替えるだけです。

      done!

      また、ビジネスロジックには必要ない冗長なデータがあることがよくあります。 _confirmationフィールドまたはCSRFトークンについて考えてください。さて、モデルの$ autopurgeredundantattributesプロパティでそれらを捨てることができます。前と同じように、それをtrueに切り替えてください。

      <span><span><?php </span></span><span>
      </span><span>    <span>class Task extends <span>\Eloquent</span> {
      </span></span><span>        <span>protected $fillable = [];
      </span></span><span>
      </span><span>        <span>public function user()
      </span></span><span>        <span>{
      </span></span><span>            <span>return $this->belongsTo('User');
      </span></span><span>        <span>}
      </span></span><span>    <span>}</span></span></span>

      今では、手順は以前よりもきれいです。

      モデルフック

      <span>{
      </span>        <span>"require": {
      </span>            <span>"laravelbook/ardent": "2.*"
      </span>        <span>}
      </span>    <span>}</span>
      言及する価値のあるもう1つの良い機能は、モデルフックの導入です。それらは、本質的に、実装された場合、特定の実行モーメントで呼び出される方法のリストです。したがって、例を作成するために、aghtupdate()メソッドは、すべての更新()呼び出しの前に呼び出されます。前のValidate()メソッドは、すべての検証の前に呼び出されます。

      これらすべての方法のリストを次に示します

      • beforecreate()
      • abhercreate()
      • beforesave()
      • abhersave()
      • befored
    • afthupdate()
    • beforedelete()
    • afterdelete()
    • beforevalidate()
    • aftervalidate()
    古典的な例は、保存手順の前にデータの詳細を強化する可能性があります。このように:

    php artisan migrate:make todo_setup
    すべての「前」メソッドにはブールリターン値があります。 Trueの場合、次の操作が正常に実行されます。メソッドがfalseを返すと、操作は停止します。上記の方法では、検証の直後に、beforesave()メソッドでナメクジを生成しました(および適切なフィールドを埋めます)。

    beforesave()とabhersave()についての特定のヒントもあります。実行時に宣言できます。見てください:

    アプリケーションでのこれらのメソッドのいくつかの可能な用途について考えてみましょう。
    <span><span><?php </span></span><span>
    </span><span>    <span>use Illuminate<span>\Database\Schema\Blueprint</span>;
    </span></span><span>    <span>use Illuminate<span>\Database\Migrations\Migration</span>;
    </span></span><span>
    </span><span>    <span>class TodoSetup extends Migration {
    </span></span><span>
    </span><span>        <span>/**
    </span></span><span><span>         * Run the migrations.
    </span></span><span><span>         *
    </span></span><span><span>         * <span>@return <span>void</span>
    </span></span></span><span><span>         */
    </span></span><span>        <span>public function up()
    </span></span><span>        <span>{
    </span></span><span>            <span>Schema<span>::</span>create('users', function(Blueprint $table)
    </span></span><span>            <span>{
    </span></span><span>                <span>$table->increments('id')->unsigned();
    </span></span><span>
    </span><span>                <span>$table->string('first_name');
    </span></span><span>                <span>$table->string('last_name');
    </span></span><span>                <span>$table->string('email');
    </span></span><span>                <span>$table->string('password', 60);
    </span></span><span>
    </span><span>                <span>$table->timestamps();
    </span></span><span>            <span>});
    </span></span><span>
    </span><span>            <span>Schema<span>::</span>create('tasks', function(Blueprint $table)
    </span></span><span>            <span>{
    </span></span><span>                <span>$table->increments('id');
    </span></span><span>
    </span><span>                <span>$table->string('name');
    </span></span><span>                <span>$table->boolean('status');
    </span></span><span>
    </span><span>                <span>$table->integer('user_id')->unsigned();
    </span></span><span>
    </span><span>                <span>$table->timestamps();
    </span></span><span>
    </span><span>                <span>$table->index('user_id');
    </span></span><span>            <span>});
    </span></span><span>        <span>}
    </span></span><span>
    </span><span>        <span>/**
    </span></span><span><span>         * Reverse the migrations.
    </span></span><span><span>         *
    </span></span><span><span>         * <span>@return <span>void</span>
    </span></span></span><span><span>         */
    </span></span><span>        <span>public function down()
    </span></span><span>        <span>{
    </span></span><span>            <span>Schema<span>::</span>dropIfExists('users');
    </span></span><span>            <span>Schema<span>::</span>dropIfExists('tasks');
    </span></span><span>        <span>}
    </span></span><span>
    </span><span>    <span>}</span></span></span>

    たぶん、パスワードハッシュを処理するbeforesave()?

    ユーザーが手順を削除する直前に

    またはクリーニングフック?
    <span><span><?php </span></span><span>
    </span><span>    <span>use Illuminate<span>\Auth\UserTrait</span>;
    </span></span><span>    <span>use Illuminate<span>\Auth\UserInterface</span>;
    </span></span><span>    <span>use Illuminate<span>\Auth\Reminders\RemindableTrait</span>;
    </span></span><span>    <span>use Illuminate<span>\Auth\Reminders\RemindableInterface</span>;
    </span></span><span>
    </span><span>    <span>class User extends Eloquent implements UserInterface, RemindableInterface {
    </span></span><span>
    </span><span>        <span>use UserTrait, RemindableTrait;
    </span></span><span>
    </span><span>        <span>/**
    </span></span><span><span>         * The database table used by the model.
    </span></span><span><span>         *
    </span></span><span><span>         * <span>@var <span>string</span>
    </span></span></span><span><span>         */
    </span></span><span>        <span>protected $table = 'users';
    </span></span><span>
    </span><span>        <span>/**
    </span></span><span><span>         * The attributes excluded from the model's JSON form.
    </span></span><span><span>         *
    </span></span><span><span>         * <span>@var <span>array</span>
    </span></span></span><span><span>         */
    </span></span><span>        <span>protected $hidden = array('password', 'remember_token');
    </span></span><span>
    </span><span>        <span>public function tasks()
    </span></span><span>        <span>{
    </span></span><span>            <span>return $this->hasMany('Task');
    </span></span><span>        <span>}
    </span></span><span>
    </span><span>    <span>}</span></span></span>

    多くの可能性があります。
    <span><span><?php </span></span><span>
    </span><span>    <span>class Task extends <span>\Eloquent</span> {
    </span></span><span>        <span>protected $fillable = [];
    </span></span><span>
    </span><span>        <span>public function user()
    </span></span><span>        <span>{
    </span></span><span>            <span>return $this->belongsTo('User');
    </span></span><span>        <span>}
    </span></span><span>    <span>}</span></span></span>

    関係の定義(熱心な方法)

    熱心では、以前よりも短い方法で関係を定義することもできます。モデル間の関係を実際に定義する方法を見てみましょう。次の例は、ユーザーモデルのtasks()メソッドを示しています。

    ARDENTを使用して関係を定義することは、$ RelationsDataと呼ばれる単純な配列を定義することを意味します。

    <span>{
    </span>        <span>"require": {
    </span>            <span>"laravelbook/ardent": "2.*"
    </span>        <span>}
    </span>    <span>}</span>
    これはまったく同じ効果があります。 Ardentは、同じ命名条約を使用して、名前と方法を1つずつ書くことなくバインドします。

    ただし、できることはたくさんあります:

    <span><span><?php </span></span><span>    <span>class User extends <span>\LaravelBook\Ardent\Ardent</span> {
    </span></span><span>        <span>// model code here!
    </span></span><span>    <span>}</span></span></span>

    $ RelationsDataのすべての要素には、キー(はい、関係のメソッド名)といくつかのパラメーターがある配列があります。

    最初のパラメーター(キーなしで、最初のパラメーター)は、関係タイプ(hasone、hasmany、belongsto、belongstomany、morpho、morphone、morphmany)を説明しています。

    2番目のパラメーター(キーなしで、2番目のパラメーター)は、現在の関係の宛先モデルを定義します。
    <span><span><?php </span></span><span>
    </span><span>    <span>public function postSignup()
    </span></span><span>    <span>{
    </span></span><span>        <span>$rules = array(
    </span></span><span>            <span>'first_name' => 'required',
    </span></span><span>            <span>'last_name' => 'required',
    </span></span><span>            <span>'email' => 'required|email|unique:users',
    </span></span><span>            <span>'password' => 'required|min:8'
    </span></span><span>        <span>);
    </span></span><span>
    </span><span>        <span>$messages = array(
    </span></span><span>            <span>'first_name.required' => 'First name is required.',
    </span></span><span>            <span>'last_name.required' => 'Last name is required.',
    </span></span><span>            <span>'email.required' => 'Email is required.',
    </span></span><span>            <span>'password.required' => 'Password is required.',
    </span></span><span>
    </span><span>            <span>'email.email' => 'Use a real email address!',
    </span></span><span>            <span>'email.unique' => 'This email address already exists!',
    </span></span><span>            <span>'password.min' => 'Password must be at least 8 character long.'
    </span></span><span>        <span>);
    </span></span><span>
    </span><span>        <span>$validator = Validator<span>::</span>make(Input<span>::</span>all(), $rules, $messages);
    </span></span><span>
    </span><span>        <span>if($validator->fails())
    </span></span><span>        <span>{
    </span></span><span>            <span>return Redirect<span>::</span>to('user/signup')->with('errors', $validator->messages());
    </span></span><span>        <span>}
    </span></span><span>
    </span><span>        <span>$user = new User;
    </span></span><span>
    </span><span>        <span>$user->first_name = Input<span>::</span>get('first_name');
    </span></span><span>        <span>$user->last_name = Input<span>::</span>get('last_name');
    </span></span><span>        <span>$user->email = Input<span>::</span>get('email');
    </span></span><span>        <span>$user->password = Hash<span>::</span>make(Input<span>::</span>get('password'));
    </span></span><span>
    </span><span>        <span>if($user->save())
    </span></span><span>        <span>{
    </span></span><span>            <span>$status = 1;
    </span></span><span>        <span>}
    </span></span><span>        <span>else
    </span></span><span>        <span>{
    </span></span><span>            <span>$status = 0;
    </span></span><span>        <span>}
    </span></span><span>
    </span><span>        <span>return Redirect<span>::</span>to('user/signup')->with('status', $status);
    </span></span><span>    <span>}</span></span></span>
    さらなるパラメーターには特定の位置がありませんが、キーがあります。彼らは次のとおりです:

      foreignkey:オプション、hasone、hasmany、belongsto、およびbelongstomany;
    • に使用されます
    • テーブル、その他のキー、タイムスタンプ、ピボットキー:オプション、belongStomanyに使用;
    • 名前、タイプ、ID:Morphto、Molphone、Morphmanyで使用;

      • 結論
      • 大きな利点(126Kのダウンロードや頻繁な更新)がある大きなパックを使用して、次のアプリで熱心を使用しない理由を見つけることは非常に困難です。あらゆる種類のプロジェクトに適しており、雄弁のモデルの拡張であるため、Laravelプロジェクトとの完全な互換性を実現します。
      • 私は間違いなくそれをお勧めします。あなたは?試してみましたか?以下のコメントでお知らせください!
      • Laravelモデルに関するよくある質問(FAQ)

        Laravel 4.2、5.0、7.x、および10.xの雄弁の重要な違いは何ですか?

        Laravel Eloquentは、バージョン4.2から10.xに大幅に進化しました。 Laravel 4.2では、Eloquentは基本的なCRUD操作を備えた単純なORM(オブジェクトリレーショナルマッピング)でした。 Laravel 5.0は、複数の接続、ソフトデレクト、イベント処理などの新機能を導入しました。 Laravel 7.Xは、熱心な荷重、モデルのシリアル化、およびAPIリソースをもたらしました。 Laravel 10.Xは、パフォーマンスの向上、エラー処理の改善、バッチ操作やモデル工場などの高度な機能により、さらに強化されました。 Laravelに自己検証のスマート雄弁モデルを追加します。属性が保存される前に自動検証を提供するため、コントローラーに記述する必要がある検証コードの量が減ります。 Ardentは、モデルとその関係のネストされたトランザクションセーフの保存もサポートしています。これにより、複雑な保存操作が簡素化されます。

        Laravel Eloquentで複数の接続を使用するにはどうすればよいですか?データベース接続は、config/database.phpファイルでそれらを定義します。次に、雄弁モデルでは、$ connectionプロパティで使用する接続を指定できます。たとえば、保護された$ connection = 'mysql2'; 「mysql2」接続を使用します。

        laravel雄弁さの熱心な読み込みは何ですか?

        熱心な読み込みは、複数のクエリではなく、単一のデータベースクエリに関連データをロードする方法です。これにより、大規模なデータセットを操作するときにパフォーマンスが大幅に向上する可能性があります。 Eloquentでwith()メソッドを使用して、熱心な負荷との関係を指定できます。 '実際にデータベースから削除することなくレコード。代わりに、削除された_ATタイムスタンプが設定されています。 softdeletes特性を使用してテーブルに削除列を追加することにより、雄弁モデルのソフトデレートを有効にすることができます。データベースをテストまたはシードするための新しいモデルインスタンスを生成する便利な方法。モデルのデフォルト属性値を指定するモデルファクトリを定義し、ファクトリーを使用してそれらのデフォルトで新しいインスタンスを作成できます。 > Ardentは、単一のデータベーストランザクションでモデルとその関連するすべてのモデルを保存するSavenested()メソッドを提供します。これにより、すべての節約が成功するか、何もないことを保証し、データの完全性を維持します。

        laravel eloquentでAPIリソースを使用するにはどうすればよいですか?

        laravel eloquentのAPIリソースを使用すると、モデルとモデルコレクションをJSON形式に変換してAPIで使用できます。モデルの変換方法を定義するリソースクラスを作成し、APIルートからそのリソースクラスのインスタンスを返すことができます。保存する前に、モデルで定義された一連のルールに対するモデルの属性。検証が失敗した場合、保存操作が中止され、ERRORS()メソッドを使用して検証エラーが利用可能です。 ()Laravel Eloquentのメソッドは、モデルが「起動」されているとき、つまりメモリにロードされたときに呼び出されるライフサイクルフックです。このメソッドをモデルにオーバーライドして、イベントリスナーの登録やモデルの構成のカスタマイズなど、モデルの起動時に発生する動作を追加できます。

以上がARDENT:ステロイドのLaravelモデルの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
Laravelでフラッシュセッションデータを使用しますLaravelでフラッシュセッションデータを使用しますMar 12, 2025 pm 05:08 PM

Laravelは、直感的なフラッシュメソッドを使用して、一時的なセッションデータの処理を簡素化します。これは、アプリケーション内に簡単なメッセージ、アラート、または通知を表示するのに最適です。 データは、デフォルトで次の要求のためにのみ持続します。 $リクエスト -

PHPのカール:REST APIでPHPカール拡張機能を使用する方法PHPのカール:REST APIでPHPカール拡張機能を使用する方法Mar 14, 2025 am 11:42 AM

PHPクライアントURL(CURL)拡張機能は、開発者にとって強力なツールであり、リモートサーバーやREST APIとのシームレスな対話を可能にします。尊敬されるマルチプロトコルファイル転送ライブラリであるLibcurlを活用することにより、PHP Curlは効率的なexecuを促進します

Laravelテストでの簡略化されたHTTP応答のモッキングLaravelテストでの簡略化されたHTTP応答のモッキングMar 12, 2025 pm 05:09 PM

Laravelは簡潔なHTTP応答シミュレーション構文を提供し、HTTP相互作用テストを簡素化します。このアプローチは、テストシミュレーションをより直感的にしながら、コード冗長性を大幅に削減します。 基本的な実装は、さまざまな応答タイプのショートカットを提供します。 Illuminate \ support \ facades \ httpを使用します。 http :: fake([[ 'google.com' => 'hello world'、 'github.com' => ['foo' => 'bar']、 'forge.laravel.com' =>

Codecanyonで12の最高のPHPチャットスクリプトCodecanyonで12の最高のPHPチャットスクリプトMar 13, 2025 pm 12:08 PM

顧客の最も差し迫った問題にリアルタイムでインスタントソリューションを提供したいですか? ライブチャットを使用すると、顧客とのリアルタイムな会話を行い、すぐに問題を解決できます。それはあなたがあなたのカスタムにより速いサービスを提供することを可能にします

Laravelサービスプロバイダーを登録および使用する方法Laravelサービスプロバイダーを登録および使用する方法Mar 07, 2025 am 01:18 AM

Laravelのサービスコンテナとサービスプロバイダーは、そのアーキテクチャの基本です。 この記事では、サービスコンテナ、詳細サービスプロバイダーの作成、登録、および実用的な使用法を例で説明します。 Oveから始めます

PHPロギング:PHPログ分析のベストプラクティスPHPロギング:PHPログ分析のベストプラクティスMar 10, 2025 pm 02:32 PM

PHPロギングは、Webアプリケーションの監視とデバッグ、および重要なイベント、エラー、ランタイムの動作をキャプチャするために不可欠です。システムのパフォーマンスに関する貴重な洞察を提供し、問題の特定に役立ち、より速いトラブルシューティングをサポートします

PHPにおける後期静的結合の概念を説明します。PHPにおける後期静的結合の概念を説明します。Mar 21, 2025 pm 01:33 PM

記事では、PHP 5.3で導入されたPHPの後期静的結合(LSB)について説明し、より柔軟な継承を求める静的メソッドコールのランタイム解像度を可能にします。 LSBの実用的なアプリケーションと潜在的なパフォーマ

フレームワークのカスタマイズ/拡張:カスタム機能を追加する方法。フレームワークのカスタマイズ/拡張:カスタム機能を追加する方法。Mar 28, 2025 pm 05:12 PM

この記事では、フレームワークにカスタム機能を追加し、アーキテクチャの理解、拡張ポイントの識別、統合とデバッグのベストプラクティスに焦点を当てています。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

SublimeText3 英語版

SublimeText3 英語版

推奨: Win バージョン、コードプロンプトをサポート!

MantisBT

MantisBT

Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

WebStorm Mac版

WebStorm Mac版

便利なJavaScript開発ツール