نسخه:

الکوئنت: سریال سازی

معرفی

هنگام ساخت API با استفاده از لاراول، اغلب نیاز دارید که مدل ها و روابط خود را به آرایه یا JSON تبدیل کنید. Eloquent شامل روش‌های راحت برای انجام این تبدیل‌ها، و همچنین کنترل ویژگی‌هایی است که در نمایش سریالی مدل‌های شما گنجانده شده‌اند.

برای یک روش قوی تر برای مدیریت مدل Eloquent و مجموعه JSON سریال سازی، مستندات منابع API Eloquent را بررسی کنید .

سریال سازی مدل ها و مجموعه ها

سریال سازی به آرایه ها

برای تبدیل یک مدل و روابط بارگذاری شده آن به یک آرایه، باید از toArray روش استفاده کنید. این روش بازگشتی است، بنابراین تمام ویژگی ها و همه روابط (از جمله روابط روابط) به آرایه تبدیل می شوند:

use App\Models\User;
 
$user = User::with('roles')->first();
 
return $user->toArray();

این attributesToArray روش ممکن است برای تبدیل ویژگی های یک مدل به یک آرایه استفاده شود، اما نه روابط آن:

$user = User::first();
 
return $user->attributesToArray();

همچنین می توانید کل مجموعه مدل ها را با فراخوانی toArray متد در نمونه مجموعه به آرایه تبدیل کنید:

$users = User::all();
 
return $users->toArray();

پخش سریال به JSON

برای تبدیل یک مدل به JSON، باید از toJson روش استفاده کنید. مانند toArray ، toJson روش بازگشتی است، بنابراین تمام ویژگی ها و روابط به JSON تبدیل می شوند. همچنین می‌توانید گزینه‌های کدگذاری JSON که توسط PHP پشتیبانی می‌شوند را مشخص کنید :

use App\Models\User;
 
$user = User::find(1);
 
return $user->toJson();
 
return $user->toJson(JSON_PRETTY_PRINT);

همچنین، می‌توانید یک مدل یا مجموعه را به یک رشته ارسال کنید، که به طور خودکار toJson متد را در مدل یا مجموعه فراخوانی می‌کند:

return (string) User::find(1);

از آنجایی که مدل‌ها و مجموعه‌ها هنگام فرستادن به رشته به JSON تبدیل می‌شوند، می‌توانید اشیاء Eloquent را مستقیماً از مسیرها یا کنترل‌کننده‌های برنامه خود برگردانید. لاراول به‌طور خودکار مدل‌ها و مجموعه‌های Eloquent شما را وقتی که از مسیرها یا کنترلرها برگردانده می‌شوند به JSON تبدیل می‌کند:

Route::get('users', function () {
return User::all();
});

روابط

هنگامی که یک مدل Eloquent به JSON تبدیل می شود، روابط بارگذاری شده آن به طور خودکار به عنوان ویژگی در شی JSON گنجانده می شود. همچنین، اگرچه روش‌های ارتباط Eloquent با استفاده از نام‌های متد "camel case" تعریف می‌شوند، ویژگی JSON یک رابطه، "snake case" خواهد بود.

پنهان کردن ویژگی ها از JSON

گاهی اوقات ممکن است بخواهید ویژگی هایی مانند رمزهای عبور را که در آرایه مدل شما یا نمایش JSON گنجانده شده اند، محدود کنید. برای انجام این کار، یک $hidden ویژگی به مدل خود اضافه کنید. ویژگی‌هایی که در آرایه ویژگی فهرست شده‌اند $hidden در نمایش سریالی مدل شما لحاظ نمی‌شوند:

<?php
 
namespace App\Models;
 
use Illuminate\Database\Eloquent\Model;
 
class User extends Model
{
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = ['password'];
}

برای پنهان کردن روابط، نام متد رابطه را به $hidden ویژگی مدل Eloquent خود اضافه کنید.

از طرف دیگر، می‌توانید از این visible ویژگی برای تعریف «لیست مجاز» از ویژگی‌هایی که باید در آرایه مدل شما و نمایش JSON استفاده شود، استفاده کنید. $visible هنگامی که مدل به آرایه یا JSON تبدیل می شود، تمام ویژگی هایی که در آرایه وجود ندارند پنهان می شوند:

<?php
 
namespace App\Models;
 
use Illuminate\Database\Eloquent\Model;
 
class User extends Model
{
/**
* The attributes that should be visible in arrays.
*
* @var array
*/
protected $visible = ['first_name', 'last_name'];
}

تغییر موقت نمایان بودن ویژگی

اگر می‌خواهید برخی از ویژگی‌های پنهان را در یک نمونه مدل مشخص نمایان کنید، می‌توانید از این makeVisible روش استفاده کنید. متد makeVisible نمونه مدل را برمی گرداند:

return $user->makeVisible('attribute')->toArray();

به همین ترتیب، اگر می‌خواهید برخی از ویژگی‌هایی را که معمولاً قابل مشاهده هستند پنهان کنید، می‌توانید از makeHidden روش استفاده کنید.

return $user->makeHidden('attribute')->toArray();

اگر می خواهید به طور موقت همه ویژگی های قابل مشاهده یا پنهان را لغو کنید، می توانید به ترتیب از روش های setVisible و استفاده کنید setHidden :

return $user->setVisible(['id', 'name'])->toArray();
 
return $user->setHidden(['email', 'password', 'remember_token'])->toArray();

افزودن مقادیر به JSON

گاهی اوقات، هنگام تبدیل مدل ها به آرایه یا JSON، ممکن است بخواهید ویژگی هایی را اضافه کنید که ستون مربوطه در پایگاه داده شما ندارند. برای انجام این کار، ابتدا یک Accessor برای مقدار تعریف کنید:

<?php
 
namespace App\Models;
 
use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Model;
 
class User extends Model
{
/**
* Determine if the user is an administrator.
*/
protected function isAdmin(): Attribute
{
return new Attribute(
get: fn () => 'yes',
);
}
}

اگر می‌خواهید که دسترسی همیشه به آرایه مدل شما و نمایش‌های JSON اضافه شود، می‌توانید نام ویژگی را به ویژگی appends مدل خود اضافه کنید. توجه داشته باشید که نام‌های ویژگی معمولاً با استفاده از نمایش سریالی «مورد مار» ارجاع می‌شوند، حتی اگر متد PHP دسترسی با استفاده از «مورد شتر» تعریف شده باشد:

<?php
 
namespace App\Models;
 
use Illuminate\Database\Eloquent\Model;
 
class User extends Model
{
/**
* The accessors to append to the model's array form.
*
* @var array
*/
protected $appends = ['is_admin'];
}

هنگامی که ویژگی به لیست اضافه شد appends ، هم در آرایه مدل و هم در نمایش JSON گنجانده می شود. ویژگی های موجود در appends آرایه نیز به تنظیمات visible و hidden تنظیمات پیکربندی شده روی مدل احترام می گذارند.

در زمان اجرا اضافه می شود

در زمان اجرا، ممکن است به یک نمونه مدل دستور دهید تا با استفاده از append روش، ویژگی‌های اضافی را اضافه کند. یا، می‌توانید از این setAppends روش برای نادیده گرفتن کل آرایه ویژگی‌های ضمیمه شده برای یک نمونه مدل استفاده کنید:

return $user->append('is_admin')->toArray();
 
return $user->setAppends(['is_admin'])->toArray();

سریال سازی تاریخ

سفارشی کردن قالب پیش فرض تاریخ

می‌توانید با نادیده گرفتن روش، قالب سریال‌سازی پیش‌فرض را سفارشی کنید serializeDate . این روش بر نحوه قالب بندی تاریخ های شما برای ذخیره سازی در پایگاه داده تأثیر نمی گذارد:

/**
* Prepare a date for array / JSON serialization.
*/
protected function serializeDate(DateTimeInterface $date): string
{
return $date->format('Y-m-d');
}

سفارشی کردن قالب تاریخ در هر ویژگی

می‌توانید با تعیین قالب تاریخ در اعلان‌های بازیگران مدل، قالب سریال‌سازی ویژگی‌های تاریخ Eloquent را سفارشی کنید :

protected function casts(): array
{
return [
'birthday' => 'date:Y-m-d',
'joined_at' => 'datetime:Y-m-d H:00',
];
}