Trang chủ » MUTATOR là gì? Những điều bạn cần biết về nó

MUTATOR là gì? Những điều bạn cần biết về nó

Đinh Thao 29 Th10, 2021

Accessors và Mutators đều cho phép chúng ta format lại các giá trị thuộc tính của Eloquent khi lấy ra hoặc thêm vào Model. Vậy Matators là gì và công dụng mà Mutators đem lại như thế nào?

Mutator là gì?

Trình đột biến, trong ngữ cảnh của C #, là một phương thức, với mức khả năng truy cập công khai, được sử dụng để sửa đổi và kiểm soát giá trị của một biến thành viên riêng của một lớp. Bộ đột biến được sử dụng để gán một giá trị mới cho trường riêng của một kiểu. Nó tạo thành một công cụ để thực hiện đóng gói bằng cách chỉ kiểm soát quyền truy cập vào các giá trị trường nội bộ phải được sửa đổi.

Mutator là gì

Mutator là gì

Hiểu theo cách đơn giản hơn thì Mutator cho phép các developer có thể set giá trị thuộc tính trước khi lưu chúng xuống database.

Ví dụ, bạn muốn người dùng có thể nhập giá trị first_name tùy ý (có thể là chữ thường hoặc chữ in hoa), nhưng khi lưu xuống database tất cả các ký tự phải chuyển thành ký tự thường hết chẳng hạn.

use App\Models\User;

$user= User::find(1);

$user->first_name = strtolower(‘ManhDanBlogs’);

Trước hết để định nghĩa một Mutators, mình sẽ định nghĩa một phương thức set Password Attribute trong model User:

public function setPasswordAttribute($password)

{ $this->attributes[‘password’] = bcrypt($password); }

web.php :

Route::get(‘/mutators’, function() {

    $user = App\User::find(1);

    $user->password = 123456;

    return $user->password;});

Quay lại trình duyệt và gõ địa chỉ localhost:8000/accessors . Kết quả là một đoạn ký tự đã được mã hóa. Ở ví dụ trên, hàm set Password Attribute sẽ được gọi với password truyền vào là 123456. Vậy nếu bạn muốn định nghĩa một Mutators trong một model, function của bạn phải có tiền tố là set và hậu tố là Attribute.

Date Mutators:

Theo quy tắc sẽ mặc định rằng Eloquent sẽ chuyển đổi các cột created_at và updated_at thành các instances của Carbon là mở rộng của lớp DateTime trong PHP và cung cấp thêm 1 tập hợp những method hữu ích. Sau đó bạn có thể tùy chỉnh date sẽ tự động được biến đổi, hoặc thậm chí hoàn toàn vô hiệu hóa biến đổi này, bằng cách ghi đè các $dates của model của bạn.

<?php

namespace App

use Illuminate\Database\Eloquent\Model;

class User extends Model

{

    /**

     * The attributes that should be mutated to dates.

     *

     * @var array

     */

    protected $dates = [

        ‘created_at’,

        ‘updated_at’,

        ‘deleted_at’  ];}

     Khi một cột là kiểu date, bạn có thể cài đặt giá trị của nó là một UNIX timestamp, date string (Y-m-d), date-time string và là một instance của DateTime / Carbon, và giá trị của date sẽ tự động được lưu vào trong database:

    $user = App\User::find(1);

    $user->deleted_at = now();

    $user->save();

Khi lấy thuộc tính đc liệt kê trong $dates property, nó sẽ tự động được cast vào Carbon instance, cho phép bạn sử dụng bất kỳ phương thức của Carbon nào trong attribute của bạn:

    $user = App\User::find(1);

    return $user->deleted_at->getTimestamp();

Date Format;

Mặc định, timestamp được format dưới dạng Y-m-d H:i:s . Nếu bạn cần tùy chỉnh format cho timestamp, hãy đặt thuộc tính $dateFormat trên model của bạn. Thuộc tính này sẽ quyết định giá trị date được lưu như thế nào trong database, giống như việc format chúng khi mà một model được serialized theo mảng hoặc JSON. Ví dụ:

    <?php

    namespace App;

    use Illuminate\Database\Eloquent\Model;

    class Flight extends Model

    {

        /**

         * The storage format of the model’s date columns.

         *

         * @var string

         */

        protected $dateFormat = ‘U’;

    }

Attribute Casting:

Thuộc tính $casts cung cấp một phương thức tiện lợi về việc chuyển đổi các các thuộc tính sang các kiểu dữ liệu bình thường. Thuộc tính $casts nên là một mảng có key là tên của các attribute được cast và giá trị là kiểu dữ liệu bạn muốn cast. Các kiểu dữ liệu để cast được hỗ trợ bao gồm: integer, real, float, double, string, boolean, object, array, collection, date, datetime, và timestamp. VD: cast thuộc tính is_admin từ kiểu integer sang boolean:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model

{

    /**

     * The attributes that should be cast to native types.

     *

     * @var array

     */

    protected $casts = [

        ‘is_admin’ => ‘boolean’,

    ];

}

Giờ đây, thuộc tính is_admin sẽ luôn luôn được cast thành kiểu boolean khi bạn truy cập đến nó, thậm chí nếu giá trị của nó được lưu trong database là kiểu integer:

    $user = App\User::find(1);

    if ($user->is_admin) { //}

Array & JSON Casting

Cast kiểu array đặc biệt hữu ích khi chúng ta làm việc với các column được lưu dưới dạng JSON. Giả sử database của bạn có 1 trường JSON hoặc TEXT có chứa serialized JSON, thêm vào array cast lên attribute sẽ tự động deserialize các attribute thành PHP array khi bạn truy cập trong Eloquent model:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model

{

    /**

     * The attributes that should be cast to native types.

     *

     * @var array

     */

    protected $casts = [

        ‘options’ => ‘array’, ];}

Một khi cast được định nghĩa, bạn có thể truy cập giá trị options và nó sẽ tự động được deserialize từ JSON thành PHP array. Khi bạn đặt giá trị options, nó sẽ tự động được serialize trở lại thành JSON để lưu vào trong cơ sở dữ liệu:

$user = App\User::find(1);

$options = $user->options;

$options[‘key’] = ‘value’;

$user->options = $options;

$user->save();

Qua bài viết trên bạn đã biết được khái niệm Mutator là gì? các dạng định nghĩa và cách sử dụng đối với Mutator. Thông thường Accessors và Mutators được sử dụng rất nhiều trong các dự án thiết kế website.

Đinh Thao

Đinh Thao

Tôi là Đinh Thị Thao, hiện đang là giáo viên giảng dạy tại trung tâm testerpro và cũng là tác giả chính các bài blog liên quan đến tester, ngành công nghệ thông tin tại trên trang testerpro.vn. Với 5 năm kinh nghiệm làm việc, giảng dậy tại trung tâm thì tôi hy vọng sẽ có thể truyền tải cho các bạn những kiến thức tốt nhất của tester giúp các bạn phục vụ trong công việc của bản thân.

Từ khóa:
Bình luận
Icon Phone Icon Zalo