Rumah > pembangunan bahagian belakang > tutorial php > Ardent: Model Laravel pada steroid

Ardent: Model Laravel pada steroid

William Shakespeare
Lepaskan: 2025-02-19 09:07:12
asal
229 orang telah melayarinya

3

Salah satu daripada (beberapa) perkara yang saya tidak suka tentang Laravel adalah bahawa anda tidak boleh memindahkan kod pengesahan dari pengawal anda ke model anda dengan mudah. Apabila saya menulis perisian, saya suka menggunakan prinsip "Model Lemak, Skinny Controllers". Oleh itu, bagi saya, menulis kod pengesahan dalam pengawal bukanlah perkara yang baik. Ardent: Laravel Models on Steroids

Untuk menyelesaikannya, saya ingin memperkenalkan Ardent, satu pakej yang hebat untuk Laravel 4. Untuk menjadi lebih tepat, Ardent membentangkan dirinya sebagai "model pintar diri untuk Laravel Rangka 4 yang fasih." Dengan kata lain: Tepat apa yang kita perlukan!

Ardent: Model Laravel pada steroid seperti yang anda boleh bayangkan, ia adalah lanjutan dari kelas model yang fasih, pada dasarnya. Pakej ini dilengkapi dengan beberapa fungsi baru, utiliti dan kaedah yang didedikasikan untuk pengesahan input dan perkara -perkara kecil yang lain.

Takeaways Key

Pengesahan yang dipertingkatkan: Ardent memudahkan proses pengesahan dengan membenarkan peraturan ditakrifkan secara langsung dalam model, meningkatkan organisasi kod dan pemeliharaan, terutama dalam projek yang lebih besar.

Model auto-hidrat: Ciri ini secara automatik mengisi atribut model dari input borang, mengurangkan kod boilerplate dalam pengawal dan membuat pembersih codebase dan lebih efisien.

cangkuk model: Ardent memperkenalkan cangkuk model yang merupakan kaedah yang dilaksanakan pada momen kitaran hayat tertentu, seperti sebelum dan selepas menyimpan, mengemas kini, atau memadam, memberikan kawalan yang lebih besar ke atas pengendalian data.

Hubungan yang dipermudahkan: Menentukan hubungan model lebih diselaraskan dengan bersemangat, menggunakan struktur array mudah (`$ RelationsData`), yang mengurangkan kerumitan pengurusan hubungan dalam model Laravel.
  • data pembersihan auto yang berlebihan: Ardent secara automatik boleh membuang data yang tidak perlu dari input, seperti medan pengesahan atau token CSRF, memastikan bahawa hanya data yang relevan diproses dan disimpan.
  • Aplikasi Ujian kami
  • Untuk pemahaman yang lebih baik tentang kelebihan yang boleh anda nikmati semasa menggunakan Ardent, kami akan menyediakan aplikasi ujian kecil. Tidak ada yang rumit: aplikasi senarai tugasan yang mudah. ​​
  • Sudah tentu, saya tidak akan melaksanakan aplikasi lengkap: Saya hanya ingin menerangkan beberapa prinsip, jadi saya akan membuat beberapa pengawal dan model - tiada pandangan. Selepas itu, saya akan "menterjemahkan" kod menggunakan Ardent.
  • senarai tugasan kami akan mengira dua entiti yang berbeza:

Pengguna

id

first_name
  • last_name

    e -mel
    • kata laluan
    • tugas
    • id
    • Nama
  • status (dilakukan / tidak dilakukan)
    • Projek yang sangat asas. Walau bagaimanapun, jika anda tidak mahu menulis kod, jangan risau: Saya telah menyediakan penghijrahan yang boleh anda gunakan untuk menghasilkan pangkalan data. Gunakannya!
    • Buat fail penghijrahan dengan arahan
    • Dan kemudian, isi fail dengan kod ini:
    php artisan migrate:make todo_setup
    Salin selepas log masuk
    Salin selepas log masuk
    Salin selepas log masuk

    Sekarang kita mempunyai jadual kita. Sudah tiba masanya untuk mencipta model kami. Malah di sini kita mempunyai sedikit baris untuk menulis. Inilah model pengguna (yang juga lalai).

    <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>
    Salin selepas log masuk
    Salin selepas log masuk
    Salin selepas log masuk

    Saya hanya menambah kaedah tugas untuk menggambarkan hubungan dengan model tugas.

    <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>
    Salin selepas log masuk
    Salin selepas log masuk
    Salin selepas log masuk

    Kami hanya membuat titik permulaan kami. Mulai sekarang, selepas pemasangan, kami akan melihat dua situasi yang berbeza: pertama, versi "normal" kod tanpa bersemangat. Selepas itu, kami akan membuat perbandingan dengan versi "bertambah baik". Anda akan melihat perbezaannya, percayalah.

    mari kita mulakan!

    Memasang Ardent

    Memasang Ardent sangat mudah dengan komposer. Cukup tambahkan kebergantungan kepada fail komposer.json projek anda.

    <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>
    Salin selepas log masuk
    Salin selepas log masuk
    Salin selepas log masuk

    Kemudian, selepas kemas kini, anda hanya perlu melanjutkan kelas yang bersemangat dalam model anda seperti:

    <span>{
    </span>        <span>"require": {
    </span>            <span>"laravelbook/ardent": "2.*"
    </span>        <span>}
    </span>    <span>}</span>
    Salin selepas log masuk
    Salin selepas log masuk
    Salin selepas log masuk

    ... dan anda sudah bersedia untuk pergi!

    Pengesahan data

    Perkara pertama yang perlu dilakukan ialah menganalisis bagaimana Ardent menjadikan kehidupan kita lebih mudah dalam melaksanakan pengesahan. Kami sudah tahu bagaimana untuk melakukannya dengan Laravel. Mari buat contoh klasik: kaedah pos yang akan mengendalikan data yang datang dari borang.

    Dalam situasi "normal" kita akan membuat sesuatu seperti ini:

    <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>
    Salin selepas log masuk
    Salin selepas log masuk

    ... bagaimana dengan bersemangat?

    Dengan bersemangat, perkara berubah sedikit. Pertama sekali, seperti yang anda boleh bayangkan dengan mudah, peraturan pengesahan akan dipindahkan terus ke dalam model: di sini kita akan memulakan "restyle" kita. Oleh itu, buka fail model dan ubahnya seperti:

    <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>
    Salin selepas log masuk
    Salin selepas log masuk

    apa yang berlaku? Tidak banyak: Kami menukar kelas asas model kami (dari fasih hingga bersemangat) dan kami berpindah (menggunakan sintaks yang sama, hanya satu salinan) peraturan pengesahan di sini, dengan mesej ralat tersuai.

    Jadi, persoalannya sekarang ialah: Apa yang akan kita tulis dalam pengawal kami?

    mari kita periksa:

    <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 <span>\LaravelBook\Ardent\Ardent</span> implements UserInterface, RemindableInterface {
    </span></span><span>
    </span><span>        <span>public static $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>public static $customMessages = 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>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>
    Salin selepas log masuk

    Tiada arahan pengesahan di sini. Mereka semua hilang. Ia bukan sekadar "bergerak", bagaimanapun: kaedah $ user-> simpan (), sekarang, akan kembali palsu jika terdapat beberapa masalah dalam fasa pengesahan. Kemudian, anda akan dapat mengambil kesilapan dengan kaedah $ user-> ralat ()-> semua (). Tiada Kelas Aneh: Objek yang dikembalikan akan menjadi beg mesej klasik yang mungkin anda temui semasa bekerja dengan Laravel.

    Jika anda lebih suka, bagaimanapun, anda juga boleh menggunakan $ user-> ValidationErrors Property. Dalam kes itu, atau jika anda ingin mengambil kesilapan khusus medan hanya gunakan $ user-> validationErrors-> get ('field_name').

    Sekarang, kemungkinan besar anda berfikir "OK, tetapi apakah kelebihan sebenar, di luar baris kod yang lebih sedikit?"

    Mari kita mulakan dengan yang paling penting: organisasi kod yang lebih baik bermaksud pemeliharaan projek yang lebih baik. Dalam aplikasi mudah, anda tidak boleh merasakannya sebagai keutamaan, tetapi apabila ia datang kepada projek -projek yang lebih besar, perkara -perkara boleh mudah merosakkan dengan satu keputusan yang salah. Biarkan saya membuat contoh keadaan dunia sebenar. Kami membangunkan aplikasi senarai tugas yang hebat, dan ia berkembang dengan cepat. Kami pasti memerlukan API yang tenang untuk aplikasi mudah alih. Menggunakan pengawal dalam cara "normal" bermakna menulis rutin pendaftaran lain untuk API. Dua blok berbeza dengan kod yang sama! Ini tidak baik. Di manakah prinsip lama kering (jangan ulangi diri anda)?

    Jadi, amalan terbaik akan menulis kaedah pendaftaran () dalam model yang mengendalikan segala -galanya. Menggunakan Ardent bermaksud mengendalikan segala -galanya: dari pengesahan ke prosedur simpan. Tanpa itu, kita tidak dapat mencapai fasa pertama.

    Kelebihan kedua adalah yang lebih praktikal: model auto-hidrat. Mari kita temukan bersama.

    Model auto-hydrate

    Kaedah pos kami () mengira tepatnya tiga belas baris kod. Walaupun ia kelihatan sukar, Ardent dapat menurunkan jumlah itu lagi. Lihat contoh ini:

    php artisan migrate:make todo_setup
    Salin selepas log masuk
    Salin selepas log masuk
    Salin selepas log masuk

    Tiada kesilapan di sini. Anda mungkin sudah memahami apa yang berlaku.

    Ardent mempunyai ciri model auto-hidrat model. Ini bermakna apabila anda membuat objek dan panggil kaedah $ user-> simpan (), setiap bidang diisi secara automatik dengan data objek input. Sudah tentu, anda perlu memberikan nama yang betul di setiap bidang borang dengan sewajarnya.

    Jadi, kod ini:

    <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>
    Salin selepas log masuk
    Salin selepas log masuk
    Salin selepas log masuk

    akan mempunyai kesan yang sama seperti

    <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>
    Salin selepas log masuk
    Salin selepas log masuk
    Salin selepas log masuk

    dari tiga baris kami hanya turun hingga tujuh untuk prosedur pendaftaran keseluruhan.

    Untuk menggunakan ciri ini, anda perlu mengaktifkannya. Hanya menukar $ autohydrateentityFrominput dalam model anda untuk benar, seperti ini:

    <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>
    Salin selepas log masuk
    Salin selepas log masuk
    Salin selepas log masuk

    selesai!

    anda juga akan sering mempunyai beberapa data berlebihan yang anda tidak perlukan untuk logik perniagaan. Fikirkan tentang bidang _confirmation atau token CSRF. Nah, kita boleh membuangnya dengan harta $ AutopurgeredundantTributes model. Seperti dahulu, hanya beralih ke benar.

    <span>{
    </span>        <span>"require": {
    </span>            <span>"laravelbook/ardent": "2.*"
    </span>        <span>}
    </span>    <span>}</span>
    Salin selepas log masuk
    Salin selepas log masuk
    Salin selepas log masuk

    sekarang prosedurnya lebih bersih daripada sebelumnya.

    cangkuk model

    Satu lagi ciri yang baik yang patut disebut ialah pengenalan cangkuk model. Mereka pada dasarnya, senarai kaedah yang, jika dilaksanakan, dipanggil dalam momen pelaksanaan tertentu. Oleh itu, untuk membuat contoh, kaedah afterupdate () akan dipanggil sebelum setiap kemas kini () panggilan. Kaedah beforevalidate () akan dipanggil sebelum setiap pengesahan, dan sebagainya.

    Berikut adalah senarai semua kaedah ini:

    • beforecreate ()
    • afterCreate ()
    • beforesave ()
    • aftersave ()
    • sebelum ini ()
    • afterUpdate ()
    • beforedelete ()
    • afterDelete ()
    • beforevalidate ()
    • afterValidate ()

    Contoh klasik boleh menjadi beberapa penghuraian data sebelum prosedur simpan. Seperti ini:

    php artisan migrate:make todo_setup
    Salin selepas log masuk
    Salin selepas log masuk
    Salin selepas log masuk

    Setiap kaedah "sebelum" mempunyai nilai pulangan Boolean. Jika benar, operasi berikut dilaksanakan secara normal. Sekiranya kaedah itu kembali palsu, operasi akan dihentikan. Dalam kaedah di atas, kami menjana slug (dan mengisi medan yang betul) dengan kaedah beforesave (), selepas pengesahan.

    Terdapat juga tip khusus mengenai Beforesave () dan aftersave (): anda boleh mengisytiharkannya pada masa yang berlalu. Lihat:

    <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>
    Salin selepas log masuk
    Salin selepas log masuk
    Salin selepas log masuk

    mari kita fikirkan beberapa kemungkinan penggunaan kaedah ini dalam aplikasi kami.

    mungkin beforesave () untuk menangani hashing kata laluan?

    <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>
    Salin selepas log masuk
    Salin selepas log masuk
    Salin selepas log masuk

    atau cangkuk pembersihan tepat sebelum pengguna memadam prosedur?

    <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>
    Salin selepas log masuk
    Salin selepas log masuk
    Salin selepas log masuk

    Terdapat banyak kemungkinan.

    Menentukan hubungan (cara yang bersemangat)

    dengan bersemangat, anda juga boleh menentukan hubungan dengan cara yang lebih pendek daripada sebelumnya. Mari kita lihat bagaimana kita sebenarnya menentukan hubungan kita antara model: Contoh berikut menunjukkan kaedah tugas () dalam model pengguna.

    <span>{
    </span>        <span>"require": {
    </span>            <span>"laravelbook/ardent": "2.*"
    </span>        <span>}
    </span>    <span>}</span>
    Salin selepas log masuk
    Salin selepas log masuk
    Salin selepas log masuk

    menggunakan semangat untuk menentukan hubungan bermaksud menentukan array mudah, yang dipanggil $ hubungan.

    <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>
    Salin selepas log masuk
    Salin selepas log masuk

    Ini mempunyai kesan yang sama. Ardent menggunakan konvensyen penamaan yang sama untuk mengikat nama dan kaedah, tanpa perlu menulis satu demi satu.

    Walau bagaimanapun, terdapat banyak penyesuaian yang boleh anda lakukan:

    <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>
    Salin selepas log masuk
    Salin selepas log masuk
    Setiap elemen dalam $ RelationsData mempunyai kunci (ya, nama kaedah hubungan) dan array dengan beberapa parameter.

      Parameter pertama (tanpa kunci, itu hanya yang pertama) menerangkan jenis hubungan (Hasone, Hasmany, milik, milik, morphto, morphmany).
    • parameter kedua (tanpa kunci, itu hanya yang kedua) mentakrifkan model destinasi hubungan semasa;
    • Parameter selanjutnya tidak mempunyai kedudukan tertentu, tetapi kunci. Mereka boleh:

      • Foreignkey: Pilihan, digunakan untuk hasone, hasmany, milik dan milik;
      • Jadual, Lain -lain, Timestamps dan Pivotkeys: Pilihan, digunakan untuk kepunyaan;
      • Nama, Jenis dan ID: Digunakan dengan Morphto, Morphone dan Morphmany;
      • Kesimpulan
      • dengan pek besar kelebihan (juga muat turun 126k dan kemas kini yang kerap) Sangat sukar untuk mencari alasan untuk tidak menggunakan Ardent dalam aplikasi seterusnya. Ia sesuai untuk setiap jenis projek, dan menjadi lanjutan model Eloquent, ia mencapai keserasian penuh dengan projek Laravel.
    • Saya pasti mengesyorkannya. Adakah anda? Adakah anda telah mencubanya? Beritahu kami dalam komen di bawah!

    Soalan Lazim (Soalan Lazim) Mengenai Model Laravel

    Apakah perbezaan utama antara Laravel 4.2, 5.0, 7.x, dan 10.x Eloquent? Di Laravel 4.2, fasih adalah ORM mudah (pemetaan objek-objek) dengan operasi CRUD asas. Laravel 5.0 memperkenalkan ciri -ciri baru seperti pelbagai sambungan, pemadaman lembut, dan pengendalian acara. Laravel 7.x membawa pemuatan yang bersemangat, siri model, dan sumber API. Laravel 10.x telah meningkatkan lagi fasih dengan prestasi yang lebih baik, pengendalian ralat yang lebih baik, dan ciri -ciri canggih seperti operasi batch dan kilang model. Menambah model cerdas pintar diri untuk Laravel. Ia menyediakan pengesahan automatik atribut sebelum disimpan, yang mengurangkan jumlah kod pengesahan yang perlu anda tulis dalam pengawal anda. Ardent juga menyokong penjimatan model dan hubungan mereka yang selamat dari transaksi, yang memudahkan operasi menjimatkan kompleks. Sambungan pangkalan data dengan menentukannya dalam fail config/database.php anda. Kemudian, dalam model fasih anda, anda boleh menentukan sambungan mana yang hendak digunakan dengan harta sambungan $. Sebagai contoh, dilindungi $ connection = 'mysql2'; akan menggunakan sambungan 'MySQL2'. Ini dapat meningkatkan prestasi dengan ketara apabila bekerja dengan dataset yang besar. Anda boleh menggunakan kaedah dengan () dalam fasih untuk menentukan hubungan yang mana dengan beban yang bersemangat. 'Rekod tanpa benar -benar mengeluarkannya dari pangkalan data. Sebaliknya, timestamp yang dipadam ditetapkan. Anda boleh mengaktifkan pemadaman lembut dalam model yang fasih dengan menggunakan sifat softdeletes dan menambah lajur yang dipadam ke meja anda. Cara yang mudah untuk menjana contoh model baru untuk menguji atau membiakkan pangkalan data anda. Anda boleh menentukan kilang model yang menentukan nilai atribut lalai untuk model anda, dan kemudian gunakan kilang untuk membuat contoh baru dengan mungkir tersebut. > Ardent menyediakan kaedah Savenested () yang menjimatkan model dan semua model yang berkaitan dalam satu transaksi pangkalan data. Ini memastikan bahawa semua menyelamatkan berjaya, atau tidak ada, mengekalkan integriti data anda.

    Bagaimana saya menggunakan sumber API di Laravel Eloquent? Anda boleh membuat kelas sumber yang mentakrifkan bagaimana model harus diubah, dan kemudian mengembalikan contoh kelas sumber dari laluan API anda. Atribut model terhadap satu set peraturan yang ditakrifkan dalam model sebelum menyimpan. Sekiranya pengesahan gagal, operasi menyimpan digugurkan dan ralat pengesahan tersedia melalui kaedah ralat (). () Kaedah dalam Laravel fasih adalah cangkuk kitaran hayat yang dipanggil apabila model itu 'boot', iaitu, dimuatkan ke dalam ingatan. Anda boleh menimpa kaedah ini dalam model anda untuk menambah tingkah laku yang harus berlaku apabila model itu dibuang, seperti mendaftarkan pendengar acara atau menyesuaikan konfigurasi model.

Atas ialah kandungan terperinci Ardent: Model Laravel pada steroid. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan