Cùng tìm hiểu về Framework Hanami: Models
HANAMI là gì? Hanami là một framework khá là mới, dựa trên nền Rack với cấu trúc modular được giới thiệu trong khoảng 2 năm gần đây. Hanami được tạo ra nhằm đáp ứng cho một số điều mà lập trình viên không thấy phù hợp ở rails. Về cách cài đặt Hanami thì đã có khá là nhiều bài viết, nên giờ ...
HANAMI là gì?
Hanami là một framework khá là mới, dựa trên nền Rack với cấu trúc modular được giới thiệu trong khoảng 2 năm gần đây. Hanami được tạo ra nhằm đáp ứng cho một số điều mà lập trình viên không thấy phù hợp ở rails. Về cách cài đặt Hanami thì đã có khá là nhiều bài viết, nên giờ mình sẽ đi chi tiết về Models của Hanami và so sánh sự khác nhau của Models trong Framework Rails. Về bản chất Hanami có component hanami-model, tương đương với ActiveRecord. Component này không gộp mọi thứ vào model object mà phân nhiệm vụ ra làm 2 mảng lớn thông qua Repository pattern. Trong đó Entity object sẽ đảm nhiệm việc khởi tạo object và các logic liên quan đến model, và Repository object sẽ đảm nhiệm việc lưu trữ vào lớp lưu trư như Database. Bây giờ mình sẽ đi vào ví dụ cụ thể đối với Rails và Hanami.
MODELS
Ở đây mình sẽ tạo 1 model Project và có scope sắp xếp theo thời gian mới nhất. Ở trong Rails đoạn code sẽ như sau:
# app/models/projects.rb class Project < ApplicationRecord scope :recent, ->{order(updated_at: :desc)} end
Trong Rails các model sẽ được viết ở trong thư mục app/models, còn ở trong Hanami thì nó sẽ được viết trong thư mục lib/entities và lib/repositories. Và bây giờ chúng ta cùng tìm hiểu Entities trong Hanami
ENTITIES
Một entity là đại diện cho một đối tượng nào đó, nó chứa các thuộc tính của đối tượng đó. Entity này sẽ đảm nhiệm việc khởi tạo object và các logic liên quan đến model. Dưới đây mình sẽ tạo ra một Entity.
# lib/todo_list/entities/project.rb class Project < Hanami::Entity end
Và bạn có thể tạo một đối tượng mới giống như trong Rails thông qua Entity này.
p = Project.new name: 'I-common', work_location: "Viet Nam" p.name #=> I-common p.work_location #=> "Viet Nam"
REPOSITORIES
Repository object sẽ đảm nhiệm việc lưu trữ vào lớp lưu trư như Database. Có thể hiểu một cách đơn giản, Repository giống như một cái kho lưu tất các các entity vào trong này. Cấu trúc của một Repository như sau:
# lib/todo_list/repositories/project_repository.rb class ProjectRepository < Hanami::Repository end
Việc lưu giá trị của Project vào Database có thể tham chiếu đến một Entity được lưu trong Repository hoặc sử dụng một mảng băm.
repo = ProjectRepository.new project1 = repo.create(name: 'I-common", work_location: "Viet Nam") #=> #<Project:0x007fdd379b2168 @attributes={:id=>1, :name=> 'I-common", :work_location=>"Viet Nam"}> project2 = Project.new(name: 'I-common1', work_location: "Da Nang") repo.create(project2) #=> #<Project:0x007fdd39971710 @attributes={:id=>2, :name=>"I-common1", :work_location=>"Da Nang"}>
Repository cũng có các method để tương tác với Database giống như Rails đó là: first , last , update , all , find , clear
project_repo = ProjectRepository.new first_project = project_repo.first #=> #<Project:0x007feae29f8060 @attributes={:id=>1, :name=> 'I-common", :work_location=>"Viet Nam"}> last_project = project _repo.last #=> #<Project:0x007feae29b9dd8 @attributes={:id=>2, :name=>"I-common1", :work_location=>"Da Nang"}> project_repo.update(first_project.id, work_location: "Ha Noi") #=> #<Project:0x007ff972a98620 @attributes={:id=>1, :name=> 'I-common", :work_location=>"Ha Noi"}> project_repo.all #=> [#<Project:0x007ff972a8be70 @attributes={:id=>1, :name=> 'I-common", :work_location=>"Ha Noi"}>, #<Project:0x007ff972a8b650 @attributes={:id=>2, :name=>"I-common1", :work_location=>"Da Nang">] project_repo.find(last_project.id) #=> #<Project:0x007feae29b9dd8 @attributes={:id=>2, :name=>"I-common1", :work_location=>"Da Nang"}> project_repo.delete(last_project.id) project_repo.find(last_project.id) #=> nil project_repo.clear #=> 2 project_repo.all #=> []
Tóm lại việc lợi chia tách các lớp logic model ra và được đặt vào thư mục /lib và được chia sẻ với các app điều này giúp người viết dễ dàng tìm thấy các logic ở cùng một nơi. Nhược điểm lớn nhất của Hanami ở mảng này là hanami-model vẫn còn thiếu nhiều chức năng của ActiveRecord, và nó gây nhiều trở ngại cho việc phát triển. Ở bài viết sau, mình sẽ nói về Controller ở trong Hanami. Mong các bạn góp ý để mỗi bài viết sẽ được chỉnh chu hơn.
Một số tài liệu tham khảo
- http://hanamirb.org/guides/
- https://kipalog.com/posts/So-sanh-khong-khach-quan-giua-Hanami-va-Rails