PishroApp

12 اسفند 1397 ساعت 23:20

آموزش استفاده از Accessors & Mutators در لاراول ( setAttribute و getAttribute)

ممکن است بخواهید از تابع رمزگذاری (encrypt) برای ;کد کردن یک مقدار استفاده نمایید و آن مقدار را در دیتابیس ذخیره و سپس در هنگام بازیابی، آن مقدار را بصورت عدم رمزگذاری شده و تنها با فراخوانی نام آن ردیف از جدول داشته باشد.یا حتی شما می توانید به راحتی تاریخ ذخیره شده در دیتابیس را به فرمت مورد نظر تبدیل کرده و استفاده نمایید...

Accessors and mutators در لاراول به شما این امکان را می دهد که مقادیر و ویژگی های Eloquent را هنگامی که بازیابی یا ذخیره می کنید بصورت دلخواه تنظیم کنید.

برای نمونه شما ممکن است بخواهید از تابع رمزگذاری (encrypt) برای رمزگذارییک مقدار استفاده نمایید و آن مقدار را در دیتابیس ذخیره کنید و پس از آن در هنگام بازیابی، آن مقدار را بصورت عدم رمزگذاری شده و تنها با فراخوانی نام آن ردیف از جدول داشته باشد.یا حتی شما می توانید به راحتی تاریخ ذخیره شده در دیتابیس را به فرمت مورد نظر تبدیل کرده و استفاده نمایید.

برای نمونه بگذارید یک مثال کوچک بزنم:

برای نمونه ما در دیتابیس مربوط به پست های مطالب ردیف بنام created_at داریم که زمان را بصورت میلادی و timestamp ذخیره می کنه.

خوب ما می خواهم در چندین جا تو سیستم خودمون این تاریخ رو به شمسی برگردونیم و به کاربر یا به مدیر نمایش بدیم. بهترین کار چیه بنظر شما؟

 

شاید بگید خوب ازتابع کربن یا مثلا از پلاگین جلیلی استفاده می کنیم

بله این میشه اما خوب راه ساده تری هم هست!

یا شاید بگید خوب یه تابع می نویسم و تو اون تاریخ رو تبدیل و تو جاهایی که میخوایم فراخونی میکنیم!

بله این هم درسته اما باز هم راه ساده تری هست:)

اما این راه ساده چیه؟

استفاده از Accessor  در لاراول

برای تعریف یک |Accessor شما باید یک تابع با نام getFooAttribute در مدل خودتون تعریف کنید و عملیات مورد نظر خودتون که می تونه تبدیل تاریخ، تبدیل یک رشته به json یا هرچیز دیگه ای باشه رو انجام بده

Foo نام ستونی از جدول هست که می خواهید به آن دسترسی پیدا کنید و عملیات مورد نظر رو روی مقدار اون انجام بدین.

برای نمونه ما میخوایم وقتی از دیتابیس تاریخ جدول post رو خواستم اون رو بصورت Y/m/d نمایش بدم. 

همونطور که می دونید تاریخ بصورت پیش فرض در ستون created_at در لاراول بصورت timestamp  (مثلا: 2019-02-03 04:44:55 ) ذخیره می شه.

خوب حالا شما برای تبدیل اون به فرمت دلخواهتون کافیه متد زیر رو در مدل خودتون قرار بدین:

 

public function getCreatedAtAttribute($value) {
        return date('Y/m/d',strtotime($value));
}

حالا کافیه برای نمایش تاریخ با فرمتی که بالا تعریف کردیم هنگام فراخوانی پست مربوطه بصورت عادی یعنی بصورت زیر عمل کنیم:

$post->created_at

 

خوب همونطور که می بینید ما به راحتی و بدون استفاده از توابع خاصی یا حتی شلوغ شدن کدهامون تونستیم تاریخ رو به راحتی به فرمت دلخواه تغییر بدیم و در دفعات بعد بتونیم از اون استفاده کنیم.

دقت کنید که حرف اول باید بصورت بزرگ باشه، برای نمونه اگه می خواید از این روش مقدار ستونی بنام first_name رو تغییر بدین نام تابع بصورت زیر می شود:

getFirstNameAttribute

 

نمونه ای دیگر برای دریافت نام و نام خانوادگی بصورت دلخواه:

 

// app/User.php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model {

    /**
     * Always capitalize the first name when we retrieve it
     */
    public function getFirstNameAttribute($value) {
        return ucfirst($value);
    }

    /**
     * Always capitalize the last name when we retrieve it
     */
    public function getLastNameAttribute($value) {
        return ucfirst($value);
    }

}

 

حال برای ذخیره کردن داده ها دوست داریم هنگام ذخیره سازی یک سری عملیات هایی انجام بشه باید، راه حل انجام این کار در لاراول نیز استفاده از Mutator است!

 

Mutator در لاراول

برای تعریف یک mutator در لاراول، مطابق مرحله بالا باید یک متد با نام setFooAttribute که foo نام ستونی می باشد که می خواهید به آن دسترسی پیدا کنید ایجاد نمایید.

 

خوب حالا ما میخواهیم هنگامی که first_name کاربر در دیتابیس ذخیره می شود بصورت کوچک یا strtolower باشد.

به کد زیر دقت کنید:

 

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * Set the user's first name.
     *
     * @param  string  $value
     * @return void
     */
    public function setFirstNameAttribute($value)
    {
        $this->attributes['first_name'] = strtolower($value);
    }
}

 

 

همانطور که مشاهده می کنید ما متدی بنام setFirstNameAttribute در مدل خود ایجاد کردیم و سپس با استفاده از  $this->attributes['first_name'] به ستون مورد نظر دسترسی پیدا کردیم و مقدار اون را بصورت دلخواه خودمون تغییر دادیم. 

شما می توانید عملیات های متعددی به این روش بر روی اطلاعات هنگام ذخیره سازی انجام دهید.

برای نمونه در کد زیر ما میخواهیم پسوورد دریافتی بصورت خودکار هش و در دیتابیس ذخیره شود.

 

<?php

// app/User.php

namespace App;

use Illuminate\Database\Eloquent\Model;

use Hash;

class User extends Model {

    /**
     * Always capitalize the first name when we save it to the database
     */
    public function setPasswordAttribute($value) {
        $this->attributes['password'] = Hash::make($value);
    }

}

 

حال برای نمونه شما اگر کد زیر را اجرا نمایید، پسوورد بصورت خودکار بصورت هش شده و رمزنگاری شده در دیتابیس ذخیره خواهد شد:

	User::create([
	'name' => 'iman',
	'email' => 'iman@gmail.com',
	'password' => 123456
	]);

 

به همین سادگی می توانید با ایجاد متدهای Accessors & Mutators در مدل هاتون تغییرات رو هنگام ذخیره سازی یا فراخوانی اعمال کنید.

 

فقط دقت کنید این موارد هنگام استفاده از Eloquent ها هستن و مثلا اگر شما از کلاس DB استفاده کنید این موارد عمل نخواهند کرد.

 

خوب امیدوارم این مطلب برای شما جالب و مفید باشه:)

 

درصورتی که سوالی دارید یا این مطلب براتون جالب بوده با نظرات خودتون ما رو دلگرم تر کنید:*

52 admin
نظرات

برای اطلاع از پاسخ به نظر شما می توانید ایمیل یا شماره موبایل خود را وارد نمایید. *

ایمیل و شماره موبایل شما کاملا مخفی خواهد ماند و در سایت نمایش داده نخواهد شد. *

پاسخ به نظر
اگر نظری برای این مطلب ارسال شد از طریق ایمیل مرا اطلاع بده!

هنوز برای این مطلب نظری ارسال نشده است!
0