Theo định nghĩa, một Data Mapper sẽ chuyển dữ liệu giữa các objects với một databse và cách ly chúng ta. Với Data Mapper, objects trong bộ nhớ thậm chí không cần biết là đang có database, không cần biết đến SQL interface hay database schema; và cũng chả cần domain layer biết nó đang tồn tại.

Như vậy, ta sẽ nghĩ ngay, trong Atlas, persistence layer hoàn toàn được ngắt kết nối khỏi database, nhưng đó chưa hẳn là điều sẽ sảy ra. Atlas dùng thuật ngữ Record để chỉ ra rằng objects của Atlas không phải là domain entities. Atlas Record là Record thụ động chứ không phải chủ động. Khác với đa số ORMs, objects của Atlas thể hiện persistence model, chứ không phải là domain model.

Lý do đằng sau những khác biệt này?

Nhà sáng lập Atlas, Paul Jones, lấy cảm hứng từ bài viết của Mehdi Khalili. Với ước muốn đổi mới so với Active Record pattern thông thường (object mang cả dữ liệu và hành vi, và được kết nối thực chất đến database).

Trích tác giả:

“Tôi muốn tìm ra một giải pháp thay thế cho Active Record, để chúng ta có thể bắt dầu dễ dàng như (với) Active Record cho persistence model; và sau đó refactor hướng đến domain model mầu mỡ hơn, dễ dàng hơn nếu cần thiết.”

Atlas có một loạt đặc tính đặc trưng khác với các công cụ khác.

  • Không chú giải – với tư tưởng code phải nằm trong code, chứ không phải trong comment
  • Không migrations hay database modification logic – Vì Atlas được khử ghép khỏi database (không hoàn toàn, cả package, nhìn chung, cần phải tương tác để chuyển dữ liệu tới lui), và chỉ hoạt động như model của schema mà không có creator và manager.
  • Không lazy-loading – lazy loading tưởng như rất hữu ích, nhưng cuối cùng mang lại nhiều rắc rối hơn lợi ích.
  • không có kiểu dữ liệu trừu tượng – kiểu dữ liệu luôn được hiển thị nếu có thể.
  • Hỗ trợ Composite key – Atlas hỗ trợ cả composite primary keys và composite foreign keys.

Sau những kiến thức cơ bản trên về Atlas, chúng ta hãy đi sâu thêm vào thực tế.

Cài đặt

Vì tại thời điểm viết bài, Atlas vẫn đang được hoàn thiện, nên chúng ta sẽ cài đặt phiên bản mới nhất. Đồng thời, chúng ta sẽ cài đặt thêm CLI package. Vậy chúng ta có file composer.json như sau:

Chúng ta cũng có một số PSR-4 ở đây để load tự động, chúng ta sẽ dùng PSR-4 liên tục trong bài viết.

Setting up

Trước đó, ta đã nói qua là Atlas không hoạt động như creator hay manager của schema. Đồng nghĩa với việc ta sẽ không có công cụ tạo database. Trong ví dụ, chúng ta đang tạo một database mới đơn giản từ số không, nhưng Atlas sẽ làm việc được với bất cứ database nào bạn đã có sẵn.

Chúng ta sẽ sử dụng một thiết kế database rất đơn giản. Ta sẽ có các sản phẩm và categories trong các database table riêng biệt. Với MySQL, hãy tạo database:

Sau đó, ta sẽ thêm giá trị vào cả hai table:

Khi đã phân bố xong thông tin, ta đã có thể set up ORM. Atlas có rất ít code generation. Để tạo skeleton classes (cả Table class vàMapper class), trước hết ta phải tạo file .php với thông tin liên kết database cần thiết. Như vậy, generator sẽ biết nên tạo properties nào.

Sau đó, hãy chạy generator atlas-skeleton. Generator atlas-skeleton là một công cụ CLI sử dụng thông tin kết nối database trên file connection, class name, và namespace đã cho để tạo skeleton class. Nên nhớ rằng chúng ta phải chạy generator với mỗi table riêng biệt trong database:

Sau khi chạy lệnh atlas-skeleton, chúng ta có thể kiểm tra folder /src/App/Datasource và thấy skeleton cho cả productscategory đã được tạo. Cả hai skeletons này chứa hai file. File Mapper, hầu như rỗng và class Table, chứ description của database table. Như vậy ta đã gần như setup xong.

Tiếp theo, hãy xem thứ hoạt động thực tế của Atlas!

CRUD Operations

Sau khi setup, hãy hướng đến cách sử dụng ORM. Trong phần này, chúng ta cần một Atlas instance, và ta sẽ tạo instance này bằng class AtlasContainer.

Không phức tạp tý nào cả, chúng ta autoload các class vendor, bao gồm mapper, và tạo instance Atlas với cả thông tin Mapper ProductsCategory.

Reading

Để đọc một Record hoặc một RecordSet từ database chúng ta có thể dùng dòng lệnh sau:

Lệnh này sẽ trả kết quả là một Record duy nhất, với ID 2. Để đọc RecordSet:

Lệnh này sẽ truy xuất RecordSet của 10 categories mới nhất được sắp xếp theo category_id.

Creating, updating and deleting

Để tạo, cập nhật, và xóa, Atlas sử dụng cùng nguyên tắc. Tiếp nhận và chi phối Record:

Như bạn thấy đấy, tạo thì khá đơn giản. Với cập nhật và xóa, chúng ta có thể sử dụng cùng một nguyên tắc:

Trong trường hợp này, chúng ta có thể sử dụng update cùng với giá trị table mới để cập nhật Record, hoặc delete để xóa cùng Record.

Một số điểm lưu ý về Relationships

Atlas hỗ trợ cả bốn kiểu relationship: OneToMany, ManyToOne, OneToOne and MantToMany Để thêm relationship, ta phải thêm chúng trong Mapper class.

Ở trường hợp cụ thể của ta, hãy tưởng tượng rằng mỗi category có thể có nhiều sản phẩm. với quan hệ một-nhiều. CategoryMapper của ta sẽ trong như sau:

Theo mặc định, relationship sẽ chiếm primary key trên table gốc và map key này đến cột tương ứng tại table đích. Tất nhiên, trong trường hợp ta có quan hệ nhiều-một, thì trường hợp vừa rồi sẽ không thể xảy ra. Trong trường hợp này, mọi thứ sẽ đảo ngược. Primary key ở table đích sẽ được map đến cột tương ứng trên table gốc.

Vậy, nếu ta muốn truy suất RecordSet của categories với product record liên quan, chúng có thể sử dụng method with(), giống như sau:

Khi đã biết được cách làm việc cơ bản của CRUD operation, chúng ta giờ đây có thể đi vào những ví dụ thực tiễn hơn với code dùng Atlas.

Some practical examples

Tuy chưa thể build cả một ứng dụng hoàn chỉnh, nhưng ta vẫn có thể nhìn vào một số ứng dụng đặc trưng.

Dù không nhận ra, nhưng hằng ngày chúng ta vẫn làm đi làm lại một số thao tác nhất định, như truy xuất dữ liệu. thêm và xóa database record. Ta sẽ làm như thế nào với Atlas?

Vừa rồi là một khung thao tác rất cơ bản với Atlas (thiếu OOP và các khái niệm lập trình hiện đại vì đây chỉ mới là demo).

Caveats

Cuối cùng, hãy nhìn vào hai caveats sau:

  • Atlas sử dụng code generation. Nếu bạn thay đổi một database table đã tạo code và bạn lại tạo lại, mapper class sẽ không bị viết đè. Rất hữu dụng nếu bạn đã viết custom code trong mapper class.
  • Atlas là sản phẩm đang phát triển,1.0.0-alpha1 vừa mới được giới thiệu thôi. Phải cực kỳ cẩn thận khi sử dụng…

Lời kết

Atlas mang đến nhiều ý tưởng rất mới lạ, với tính chất dễ hiểu và dễ dùng làm chủ đạo. Đặc điểm không chú thích là ít code generation là những điểm cộng sáng giá.

Techtalk via Sitepoint