در این مقاله، ما از طریق مبدل ها و Accessors از ORM Eloquent در چارچوب وب Laravel استفاده می کنیم. پس از معرفی، ما نمونه های کوچکی از این مفاهیم را می بینیم.
در Laravel، سوئیچ ها و دسترسی ها به شما اجازه می دهند داده ها را قبل از ذخیره کردن و بعد از جمع آوری اطلاعات از یک پایگاه داده تغییر دهید. به طور خاص، mutator اجازه می دهد تا قبل از اینکه یک داده را در پایگاه داده ذخیره شود، داده را تغییر دهید. از سوی دیگر، accessor به شما امکان می دهد داده ها را بعد از برداشت از یک پایگاه داده تغییر دهید.
به عنوان به مثال مدل Post را تصور کنید که با دستور زیر در CMD ایجاد می شود.
php artisan make:model Post --migration
این مدل در مسیر app/Post.php ایجاد می شود.
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
}
محتوای زیر را در کلاس بالا وارد می کنیم:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
protected $dates = [
'created_at',
'updated_at',
'published_at'
];
public function getNameAttribute($value)
{
return ucfirst($value);
}
public function setNameAttribute($value)
{
$this->attributes['name'] = strtolower($value);
}
}
با متد mutatur زیر می توانید قبل از ذخیره سازی داده در پایگاه داده تغییراتی ایجاد کنید مثلا کلمات بصورت حروف کوچک نمایش داده شود.
public function setNameAttribute($value)
{
$this->attributes['name'] = strtolower($value);
}
با متد accessor می توانید بعد از بازخوانی داده ها از پایگاه داده تغییراتی را در آن ایجاد کنید:
public function getNameAttribute($value)
{
return ucfirst($value);
}
متد بالا کلمات را بصورت حروف بزرگ نمایش می دهد.
از متد mutatur در Action ها می توان استفاده کرد:
<?php
// app/Http/Controllers/MutatorController.php
namespace App\Http\Controllers;
use App\Post;
use App\Http\Controllers\Controller;
class MutatorController extends Controller
{
public function index()
{
// create a new post object
$post = new Post;
$post->setAttribute('name', 'Post title');
$post->save();
}
}
از متد Accessor در Action به شکل زیر استفاده می کنید:
<?php
namespace App\Http\Controllers;
use App\Post;
use App\Http\Controllers\Controller;
class AccessorController extends Controller
{
public function index()
{
// load post
$post = Post::find(1);
// check the name property
echo $post->name;
// check the date property
echo $post->published_at;
// as we've mutated the published_at column as Carbon date, we can use following as well
echo $post->published_at->getTimestamp();
exit;
}
}