Laravel nhận thuộc tính với tham số

Thuộc tính Eloquent Castable là một trong những tính năng mạnh mẽ hơn của Laravel; . Trong hướng dẫn này, tôi sẽ xem qua một vài ví dụ khác nhau về cách sử dụng chúng và quan trọng nhất là tại sao bạn nên sử dụng chúng

Bạn có thể tạo một dự án Laravel mới hoặc sử dụng dự án hiện có cho hướng dẫn này. Cứ thoải mái làm theo cùng tôi, hoặc nếu bạn muốn đọc và ghi nhớ - cũng được. Điều quan trọng cần rút ra từ điều này là dàn diễn viên có tài hùng biện tốt như thế nào

Hãy bắt đầu với ví dụ đầu tiên của chúng ta, tương tự như ví dụ trong tài liệu Laravel. Tài liệu về Laravel hiển thị việc nhận địa chỉ của người dùng nhưng cũng sử dụng Mô hình. Bây giờ hãy tưởng tượng nếu đây là một cột JSON trên người dùng hoặc bất kỳ mô hình nào cho thực tế đó. Chúng tôi có thể lấy và thiết lập một số dữ liệu và bổ sung thêm để làm cho công việc này hoạt động như chúng tôi muốn. Chúng ta cần cài đặt một gói của Jess Archer có tên Laravel Castable Data Transfer Object. Bạn có thể cài đặt cái này bằng lệnh soạn thảo sau

composer require jessarcher/laravel-castable-data-transfer-object

Bây giờ chúng tôi đã cài đặt cái này, hãy thiết kế lớp Castable của chúng tôi

namespace App\Casts;

 

use JessArcher\CastableDataTransferObject\CastableDataTransferObject;

 

class Address implements CastableDataTransferObject

{

public string $nameOrNumber,

public string $streetName,

public string $localityName,

public string $town,

public string $county,

public string $postalCode,

public string $country,

}

Chúng tôi có một lớp PHP mở rộng

namespace App\Casts;

 

use JessArcher\CastableDataTransferObject\CastableDataTransferObject;

 

class Address implements CastableDataTransferObject

{

public string $nameOrNumber,

public string $streetName,

public string $localityName,

public string $town,

public string $county,

public string $postalCode,

public string $country,

}

0, cho phép chúng tôi đánh dấu các thuộc tính và loại của chúng, sau đó xử lý tất cả các tùy chọn nhận và cài đặt đằng sau hậu trường. Gói này sử dụng gói Spatie có tên là Đối tượng truyền dữ liệu dưới mui xe, gói này đã khá phổ biến trong cộng đồng. Vì vậy, bây giờ, nếu chúng tôi muốn mở rộng điều này, chúng tôi có thể

namespace App\Casts;

 

use JessArcher\CastableDataTransferObject\CastableDataTransferObject;

 

class Address implements CastableDataTransferObject

{

public string $nameOrNumber,

public string $streetName,

public string $localityName,

public string $town,

public string $county,

public string $postalCode,

public string $country,

 

public function formatString[]: string

{

return implode[', ', [

"$this->nameOrNumber $this->streetName",

$this->localityName,

$this->townName,

$this->county,

$this->postalCode,

$this->country,

]];

}

}

Chúng tôi có một lớp

namespace App\Casts;

 

use JessArcher\CastableDataTransferObject\CastableDataTransferObject;

 

class Address implements CastableDataTransferObject

{

public string $nameOrNumber,

public string $streetName,

public string $localityName,

public string $town,

public string $county,

public string $postalCode,

public string $country,

}

1 mở rộng lớp

namespace App\Casts;

 

use JessArcher\CastableDataTransferObject\CastableDataTransferObject;

 

class Address implements CastableDataTransferObject

{

public string $nameOrNumber,

public string $streetName,

public string $localityName,

public string $town,

public string $county,

public string $postalCode,

public string $country,

}

0 từ gói, lớp này xử lý tất cả việc nhận và thiết lập dữ liệu của chúng tôi cho cơ sở dữ liệu. Sau đó, chúng tôi có tất cả các thuộc tính mà chúng tôi muốn lưu trữ - đây là địa chỉ định dạng của Vương quốc Anh vì đây là nơi tôi sống. Cuối cùng, chúng tôi có một phương thức mà chúng tôi đã thêm vào giúp chúng tôi định dạng địa chỉ này dưới dạng một chuỗi - nếu chúng tôi muốn hiển thị địa chỉ này ở bất kỳ dạng nào của giao diện người dùng. Chúng tôi có thể tiến thêm một bước với xác thực mã bưu điện bằng cách sử dụng regex hoặc API - nhưng điều đó có thể làm hỏng điểm của hướng dẫn

Hãy chuyển sang một ví dụ khác. tiền bạc. Tất cả chúng ta đều hiểu tiền; . Vì vậy, hãy tưởng tượng chúng ta có một cửa hàng thương mại điện tử nơi chúng ta lưu trữ các sản phẩm của mình [một cửa hàng đơn giản nên chúng ta không phải lo lắng về các biến thể, v.v. ] và chúng tôi có một cột có tên là

namespace App\Casts;

 

use JessArcher\CastableDataTransferObject\CastableDataTransferObject;

 

class Address implements CastableDataTransferObject

{

public string $nameOrNumber,

public string $streetName,

public string $localityName,

public string $town,

public string $county,

public string $postalCode,

public string $country,

}

3 mà chúng tôi lưu trữ ở mẫu số nhỏ nhất của đơn vị tiền tệ của chúng tôi. Tôi đang ở Vương quốc Anh, vì vậy tôi sẽ gọi đồng xu này. Tuy nhiên, điều này ở Mỹ là xu. Một cách tiếp cận phổ biến để lưu trữ các giá trị tiền tệ trong cơ sở dữ liệu của chúng tôi vì nó tránh được các vấn đề toán học dấu chấm động. Vì vậy, hãy thiết kế một khuôn mẫu cho cột giá này, lần này sử dụng gói php

namespace App\Casts;

 

use JessArcher\CastableDataTransferObject\CastableDataTransferObject;

 

class Address implements CastableDataTransferObject

{

public string $nameOrNumber,

public string $streetName,

public string $localityName,

public string $town,

public string $county,

public string $postalCode,

public string $country,

}

4

________số 8

Vì vậy, lớp này không sử dụng gói DTO mà thay vào đó trả về một phiên bản mới với các phương thức riêng của nó. Trong hàm tạo của chúng tôi, chúng tôi chuyển vào một số tiền. Khi chúng tôi nhận và đặt số tiền, chúng tôi sẽ truyền tới một mảng để lưu trữ trong cơ sở dữ liệu hoặc phân tích cú pháp một mảng để trả về một đối tượng tiền mới. Tất nhiên, thay vào đó, chúng tôi có thể biến đối tượng này thành đối tượng truyền dữ liệu và kiểm soát cách chúng tôi xử lý tiền nhiều hơn một chút. Tuy nhiên, thư viện tiền php đã được thử nghiệm khá tốt và đáng tin cậy, và nếu thành thật mà nói - tôi sẽ không làm khác đi nhiều

Hãy đi đến một ví dụ mới. Chúng tôi có một ứng dụng CRM và chúng tôi muốn lưu trữ giờ hoặc ngày mở cửa của doanh nghiệp. Mỗi doanh nghiệp cần có khả năng đánh dấu ngày họ mở cửa, nhưng chỉ theo một cách đơn giản đúng hoặc sai. Vì vậy, chúng tôi có thể tạo một kiểu truyền mới, nhưng trước tiên, chúng tôi sẽ tạo lớp mà chúng tôi muốn chuyển sang, giống như lớp tiền PHP ở trên

namespace App\DataObjects;

 

class Open

{

public function __construct[

public readonly bool $monday,

public readonly bool $tuesday,

public readonly bool $wednesday,

public readonly bool $thursday,

public readonly bool $friday,

public readonly bool $saturday,

public readonly bool $sunday,

public readonly array $holidays,

] {}

}

Để bắt đầu, điều này là tốt; . Tiếp theo, chúng ta có thể thiết kế diễn viên của mình

namespace App\Casts;

 

use JessArcher\CastableDataTransferObject\CastableDataTransferObject;

 

class Address implements CastableDataTransferObject

{

public string $nameOrNumber,

public string $streetName,

public string $localityName,

public string $town,

public string $county,

public string $postalCode,

public string $country,

}

0

Hàm tạo của chúng tôi sẽ chấp nhận một mảng ngày để đơn giản hóa việc lưu [tuy nhiên, bạn sẽ cần đảm bảo rằng bạn xác thực đầu vào đúng cách tại đây]. Sau đó, khi chúng tôi muốn lấy lại dữ liệu từ cơ sở dữ liệu, chúng tôi tạo một đối tượng

namespace App\Casts;

 

use JessArcher\CastableDataTransferObject\CastableDataTransferObject;

 

class Address implements CastableDataTransferObject

{

public string $nameOrNumber,

public string $streetName,

public string $localityName,

public string $town,

public string $county,

public string $postalCode,

public string $country,

}

5 mới, chuyển vào ngày. Tuy nhiên, ở đây chúng ta đang gọi một phương thức

namespace App\Casts;

 

use JessArcher\CastableDataTransferObject\CastableDataTransferObject;

 

class Address implements CastableDataTransferObject

{

public string $nameOrNumber,

public string $streetName,

public string $localityName,

public string $town,

public string $county,

public string $postalCode,

public string $country,

}

6 mà chúng ta chưa tạo ra, vì vậy hãy thiết kế nó ngay bây giờ

namespace App\Casts;

 

use JessArcher\CastableDataTransferObject\CastableDataTransferObject;

 

class Address implements CastableDataTransferObject

{

public string $nameOrNumber,

public string $streetName,

public string $localityName,

public string $town,

public string $county,

public string $postalCode,

public string $country,

}

3

Vì vậy, chúng tôi xây dựng đối tượng Open của mình theo cách thủ công bằng cách sử dụng trình trợ giúp Laravel

namespace App\Casts;

 

use JessArcher\CastableDataTransferObject\CastableDataTransferObject;

 

class Address implements CastableDataTransferObject

{

public string $nameOrNumber,

public string $streetName,

public string $localityName,

public string $town,

public string $county,

public string $postalCode,

public string $country,

}

7, điều này cực kỳ tiện dụng, đảm bảo rằng chúng tôi đang truyền đúng loại. Bây giờ khi chúng tôi truy vấn, chúng tôi có quyền truy cập

namespace App\Casts;

 

use JessArcher\CastableDataTransferObject\CastableDataTransferObject;

 

class Address implements CastableDataTransferObject

{

public string $nameOrNumber,

public string $streetName,

public string $localityName,

public string $town,

public string $county,

public string $postalCode,

public string $country,

}

5

Như bạn có thể thấy, chúng tôi có thể làm cho điều này cực kỳ dễ đọc để trải nghiệm của nhà phát triển hợp lý và dễ theo dõi. Sau đó, chúng tôi có thể mở rộng điều này để thêm các phương thức bổ sung, chẳng hạn như hôm nay nó có mở không?

namespace App\Casts;

 

use JessArcher\CastableDataTransferObject\CastableDataTransferObject;

 

class Address implements CastableDataTransferObject

{

public string $nameOrNumber,

public string $streetName,

public string $localityName,

public string $town,

public string $county,

public string $postalCode,

public string $country,

}

6

Vì vậy, phương pháp này có thể đưa ra một giả định nhỏ rằng chúng tôi đang lưu trữ các ngày lễ trong một chuỗi ngày, nhưng logic sau. lấy ngày trong tuần, bằng tiếng Anh, vì đó là tên chỗ nghỉ của chúng tôi; . Tuy nhiên, chúng ta cũng cần kiểm tra các ngày lễ. Nếu chuỗi ngày hiện tại không có trong mảng ngày lễ, nó sẽ mở;

Vì vậy, sau đó chúng tôi có thể kiểm tra xem liệu doanh nghiệp có mở cửa hay không bằng cách sử dụng phương pháp hôm nay trên diễn viên của chúng tôi

namespace App\Casts;

 

use JessArcher\CastableDataTransferObject\CastableDataTransferObject;

 

class Address implements CastableDataTransferObject

{

public string $nameOrNumber,

public string $streetName,

public string $localityName,

public string $town,

public string $county,

public string $postalCode,

public string $country,

}

7

Như bạn có thể tưởng tượng, bạn có thể thêm nhiều phương thức vào đây, cho phép bạn kiểm tra nhiều thứ và thậm chí thêm các cách để hiển thị thông tin này một cách độc đáo

Bạn có sử dụng Truyền thuộc tính trong ứng dụng của mình không?

Chủ Đề