Mô hình xây dựng thực đơn


9

Tôi đang gặp rắc rối khi phải xử lý trạng thái hoạt động của menu khi menu không được sử dụng để định tuyến.

Tôi đến từ Drupal nơi hệ thống menu cũng xử lý việc định tuyến. do đó, việc thiết lập trạng thái hoạt động và trạng thái theo dõi hoạt động được xử lý theo tuyến đường (cũng hoạt động như một hệ thống kết xuất menu).

Bây giờ, rất nhiều khung công tác PHP có các lớp Bộ định tuyến xử lý việc định tuyến. Điều này có vẻ là một sự tách biệt tốt vì một Menu không nên biết về POST | | LỰA CHỌN | | ... Yêu cầu.

Nhưng khi viết frontend, tôi thấy mình khó mã hóa menu. Hoặc lưu trữ mọi thứ trong DB và chuyển các giá trị đó vào dạng xem. Điều tôi không thích cách tiếp cận này là bạn đang tạo một bản sao của những gì bạn đã viết trong Bộ định tuyến của mình nhưng hiện đang sử dụng lớp Menu.

Một ví dụ:

Route::get('/somewhere','routename.somewhere','showStuffController');
Route::post('/somewhere','routename.somewhere','saveStuffController');

Menu::add('label.somewhere','routename.somewhere');

Bạn đang phân tách mối quan tâm ở đây, vì vậy đó là tốt đẹp. Nhưng Menu phụ thuộc rất nhiều vào Tuyến đường để đặt trạng thái hoạt động. Menu cũng sẽ phải biết về phân cấp để đặt dấu vết hoạt động.

Vì vậy, có, thiết lập đường dẫn hoạt động và các lớp trạng thái hoạt động thực sự là một điều xem. Nhưng có

if ( Route::currentName() === $menuitem->getRouteName() ) { print 'active'; }

tất cả trên quan điểm của bạn có vẻ ngu ngốc. Sau đó thêm tất cả các dấu vết hoạt động gây phiền nhiễu nếu đó là một sự phình to thực sự. Xử lý rằng trước khi chế độ xem được hiển thị và đặt cờ theo dõi hoạt động thành đúng trông có vẻ rất xấu theo cách tôi biết (một hướng dẫn vòng lặp trên tất cả trẻ em lặp lại trên tất cả trẻ em, ...)

Câu hỏi của tôi là:

Có một mô hình hoặc một cách thông minh để làm cho sạch hơn, tốt hơn, ...? Làm thế nào một người nên xử lý 'vấn đề' hoạt động?

Tôi đã nghĩ đến việc kết xuất con -> cha mẹ. Vì vậy, bắt đầu với quảng cáo ở mức sâu nhất và sau đó làm việc theo cách của tôi. Nhưng sau đó đứa trẻ biết về cha mẹ của nó nhưng cha mẹ không biết gì về con cái của họ (có vẻ kỳ lạ).

Câu trả lời:


1

khi menu không được sử dụng để định tuyến

Tôi muốn nói rằng định tuyến có thể được sử dụng cho menu.


Như bạn đã chỉ ra, bộ định tuyến sẽ là một nơi tuyệt vời để kết nối. Tôi không nghĩ rằng việc sử dụng một hook để đánh giá meta menu cho trang hiện tại theo từng yêu cầu sẽ là điều xấu.

Nếu bạn đặt quan điểm của mình chịu trách nhiệm theo dõi trạng thái hoạt động, bạn không tách rời mối quan tâm. Các khung nhìn nên làm bất cứ điều gì chúng được tạo ra - nhưng không nhất thiết là chúng cũng quản lý trạng thái menu của chúng. Dữ liệu meta menu thường là ứng dụng rộng giống nhau và bạn chỉ cần tuyến đường để có thể tự xác định vị trí và hiển thị menu.

Tùy thuộc vào bộ định tuyến của bạn và nhu cầu của bạn một chức năng hoặc lớp đơn giản có một số dữ liệu meta menu tĩnh và tuyến hiện tại sẽ đủ để cung cấp tất cả thông tin bạn cần sau đó.

Bản thân menu meta không nhất thiết phải là một đối tượng. Một cấu trúc dữ liệu giá trị khóa đơn giản không có phương thức nên là đủ trong hầu hết các trường hợp.

Móc có thể tạo một đối tượng trạng thái với một số chức năng phổ biến liên quan đến menu của bạn, như mẩu bánh mì, độ sâu, trang cha hoặc trang hiện tại và làm cho đối tượng này được biết đến trong ngữ cảnh yêu cầu http của bạn. Bạn có những khả năng khác nhau bên trong cái móc - nhưng nói chung là về việc thu thập, chuẩn bị và chuyển dữ liệu cần thiết đến một cái gì đó biết cách đối phó với nó.

Cách tiếp cận này phù hợp với nhu cầu của bạn và có một vài lợi thế:

  1. Cơ sở dữ liệu của bạn không cần xử lý dữ liệu mà bạn có thể cung cấp khi chạy với chi phí thấp
  2. Bạn sẽ có menu (meta) ở một nơi giúp duy trì
  3. Nếu bạn muốn thực đơn của mình hoàn toàn dựa vào 1: 1 trên các tuyến đường của mình, điều đó có thể đạt được bằng cách cung cấp meta menu một cách linh hoạt
  4. Nếu nội dung của bạn phát triển (và do đó là menu), bạn có thể di chuyển dữ liệu này vào phiên có thể được ghi vào kho lưu trữ khóa nhanh
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.