cari
Rumahpembangunan bahagian belakangtutorial phpArdent: Model Laravel pada steroid

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

    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></span>

    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></span>

    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></span>

    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>

    ... 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></span>

    ... 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></span>

    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></span>

    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

    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></span>

    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></span>

    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></span>

    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>

    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

    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></span>

    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></span>

    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></span>

    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>

    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></span>

    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></span>
    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
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
Bekerja dengan Data Sesi Flash di LaravelBekerja dengan Data Sesi Flash di LaravelMar 12, 2025 pm 05:08 PM

Laravel memudahkan mengendalikan data sesi sementara menggunakan kaedah flash intuitifnya. Ini sesuai untuk memaparkan mesej ringkas, makluman, atau pemberitahuan dalam permohonan anda. Data hanya berterusan untuk permintaan seterusnya secara lalai: $ permintaan-

Curl dalam PHP: Cara Menggunakan Pelanjutan PHP Curl dalam API RESTCurl dalam PHP: Cara Menggunakan Pelanjutan PHP Curl dalam API RESTMar 14, 2025 am 11:42 AM

Pelanjutan URL Pelanggan PHP (CURL) adalah alat yang berkuasa untuk pemaju, membolehkan interaksi lancar dengan pelayan jauh dan API rehat. Dengan memanfaatkan libcurl, perpustakaan pemindahan fail multi-protokol yang dihormati, php curl memudahkan execu yang cekap

Respons HTTP yang dipermudahkan dalam ujian LaravelRespons HTTP yang dipermudahkan dalam ujian LaravelMar 12, 2025 pm 05:09 PM

Laravel menyediakan sintaks simulasi respons HTTP ringkas, memudahkan ujian interaksi HTTP. Pendekatan ini dengan ketara mengurangkan redundansi kod semasa membuat simulasi ujian anda lebih intuitif. Pelaksanaan asas menyediakan pelbagai jenis pintasan jenis tindak balas: Gunakan Illuminate \ Support \ Facades \ http; Http :: palsu ([ 'Google.com' => 'Hello World', 'github.com' => ['foo' => 'bar'], 'forge.laravel.com' =>

12 skrip sembang php terbaik di codecanyon12 skrip sembang php terbaik di codecanyonMar 13, 2025 pm 12:08 PM

Adakah anda ingin memberikan penyelesaian segera, segera kepada masalah yang paling mendesak pelanggan anda? Sembang langsung membolehkan anda mempunyai perbualan masa nyata dengan pelanggan dan menyelesaikan masalah mereka dengan serta-merta. Ia membolehkan anda memberikan perkhidmatan yang lebih pantas kepada adat anda

Pembalakan PHP: Amalan Terbaik untuk Analisis Log PHPPembalakan PHP: Amalan Terbaik untuk Analisis Log PHPMar 10, 2025 pm 02:32 PM

Pembalakan PHP adalah penting untuk memantau dan menyahpepijat aplikasi web, serta menangkap peristiwa kritikal, kesilapan, dan tingkah laku runtime. Ia memberikan pandangan yang berharga dalam prestasi sistem, membantu mengenal pasti isu -isu, dan menyokong penyelesaian masalah yang lebih cepat

Terangkan konsep pengikatan statik lewat dalam PHP.Terangkan konsep pengikatan statik lewat dalam PHP.Mar 21, 2025 pm 01:33 PM

Artikel membincangkan pengikatan statik lewat (LSB) dalam PHP, yang diperkenalkan dalam Php 5.3, yang membolehkan resolusi runtime kaedah statik memerlukan lebih banyak warisan yang fleksibel. Isu: LSB vs polimorfisme tradisional; Aplikasi Praktikal LSB dan Potensi Perfo

Menyesuaikan/Memperluas Rangka Kerja: Cara Menambah Fungsi Custom.Menyesuaikan/Memperluas Rangka Kerja: Cara Menambah Fungsi Custom.Mar 28, 2025 pm 05:12 PM

Artikel ini membincangkan menambah fungsi khusus kepada kerangka kerja, memberi tumpuan kepada pemahaman seni bina, mengenal pasti titik lanjutan, dan amalan terbaik untuk integrasi dan debugging.

See all articles

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌

Alat panas

Muat turun versi mac editor Atom

Muat turun versi mac editor Atom

Editor sumber terbuka yang paling popular

Dreamweaver Mac版

Dreamweaver Mac版

Alat pembangunan web visual

Pelayar Peperiksaan Selamat

Pelayar Peperiksaan Selamat

Pelayar Peperiksaan Selamat ialah persekitaran pelayar selamat untuk mengambil peperiksaan dalam talian dengan selamat. Perisian ini menukar mana-mana komputer menjadi stesen kerja yang selamat. Ia mengawal akses kepada mana-mana utiliti dan menghalang pelajar daripada menggunakan sumber yang tidak dibenarkan.

DVWA

DVWA

Damn Vulnerable Web App (DVWA) ialah aplikasi web PHP/MySQL yang sangat terdedah. Matlamat utamanya adalah untuk menjadi bantuan bagi profesional keselamatan untuk menguji kemahiran dan alatan mereka dalam persekitaran undang-undang, untuk membantu pembangun web lebih memahami proses mengamankan aplikasi web, dan untuk membantu guru/pelajar mengajar/belajar dalam persekitaran bilik darjah Aplikasi web keselamatan. Matlamat DVWA adalah untuk mempraktikkan beberapa kelemahan web yang paling biasa melalui antara muka yang mudah dan mudah, dengan pelbagai tahap kesukaran. Sila ambil perhatian bahawa perisian ini

mPDF

mPDF

mPDF ialah perpustakaan PHP yang boleh menjana fail PDF daripada HTML yang dikodkan UTF-8. Pengarang asal, Ian Back, menulis mPDF untuk mengeluarkan fail PDF "dengan cepat" dari tapak webnya dan mengendalikan bahasa yang berbeza. Ia lebih perlahan dan menghasilkan fail yang lebih besar apabila menggunakan fon Unicode daripada skrip asal seperti HTML2FPDF, tetapi menyokong gaya CSS dsb. dan mempunyai banyak peningkatan. Menyokong hampir semua bahasa, termasuk RTL (Arab dan Ibrani) dan CJK (Cina, Jepun dan Korea). Menyokong elemen peringkat blok bersarang (seperti P, DIV),