Pola pembuatan menu


9

Saya mengalami kesulitan untuk menangani penanganan menu aktif saat menu tidak digunakan untuk perutean.

Saya berasal dari Drupal di mana sistem menu menangani perutean juga. jadi pengaturan keadaan aktif dan keadaan jejak aktif ditangani oleh rute (yang juga berfungsi sebagai sistem rendering menu).

Sekarang, banyak kerangka kerja PHP memiliki kelas Router yang menangani perutean. Ini sepertinya pemisahan yang baik karena Menu seharusnya tidak menyadari POST || PILIHAN || ... permintaan.

Tetapi ketika menulis frontend, saya mendapati diri saya sendiri kesulitan mengode menu. Atau menyimpan segala sesuatu di DB dan meneruskan nilai-nilai itu ke tampilan. Apa yang saya tidak suka dari pendekatan ini adalah bahwa Anda semacam membuat salinan dari apa yang sudah Anda tulis di Router Anda tetapi sekarang menggunakan kelas Menu.

Sebuah contoh:

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

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

Anda memisahkan masalah di sini, jadi itu bagus. Tetapi Menu sangat bergantung pada Route untuk mengatur status aktifnya. Menu juga harus tahu tentang hierarki untuk mengatur jejak-aktif.

Jadi ya, mengatur jejak aktif, dan kelas status aktif sebenarnya adalah hal tampilan. Tetapi memiliki

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

seluruh pandanganmu tampak bodoh. Kemudian tambahkan semua jejak aktif yang mengganggu itu dan itu benar-benar menyenangkan. Menangani bahwa sebelum tampilan mendapat rendering dan mengatur flag jejak-jalan ke true sepertinya sangat jelek seperti yang saya tahu (peramalan foreach atas semua anak yang melingkari semua anak, ...)

Pertanyaanku adalah:

Apakah ada pola atau cara cerdas untuk mendapatkan pembersih ini, lebih baik, ...? Bagaimana seharusnya seseorang menangani 'masalah' jejak-aktif?

Saya sedang memikirkan rendering child -> parent. Jadi mulailah dengan iklan tingkat paling dalam dan kemudian naik ke atas. Tetapi kemudian anak itu tahu tentang orang tuanya tetapi orang tuanya tidak tahu apa-apa tentang anak-anaknya (tampak aneh).

Jawaban:


1

ketika menu tidak digunakan untuk routing

Saya akan mengatakan bahwa routing dapat digunakan untuk menu.


Seperti yang sudah Anda tunjukkan, router akan menjadi tempat yang bagus untuk menghubungkan. Saya tidak berpikir bahwa akan jelek menggunakan hook yang mengevaluasi meta menu untuk halaman saat ini pada setiap permintaan.

Jika Anda membuat pandangan Anda bertanggung jawab untuk melacak keadaan aktif Anda tidak memisahkan masalah. Pandangan harus melakukan apa pun yang mereka buat - tetapi tidak perlu bahwa mereka juga mengelola status menu mereka. Menu meta data biasanya aplikasi lebar sama dan Anda hanya perlu rute untuk dapat menemukan diri Anda dan membuat menu.

Tergantung pada router Anda dan kebutuhan Anda fungsi sederhana atau kelas yang mengambil beberapa data meta menu statis dan rute saat ini akan cukup untuk memberikan semua informasi yang Anda butuhkan sesudahnya.

Menu meta itu sendiri tidak harus berupa objek. Struktur data nilai kunci sederhana tanpa metode harus cukup dalam banyak kasus.

Hook mungkin membuat objek negara dengan beberapa fungsi umum yang terkait dengan menu Anda, seperti remah roti, kedalaman, halaman induk atau halaman saat ini dan membuat objek ini dikenal dalam konteks permintaan http Anda. Anda memiliki berbagai kemungkinan di dalam hook - tetapi umumnya tentang mengumpulkan, menyiapkan, dan menyampaikan data yang diperlukan untuk sesuatu yang tahu cara mengatasinya.

Pendekatan ini sesuai dengan kebutuhan Anda dan memiliki beberapa keunggulan:

  1. Basis data Anda tidak perlu berurusan dengan data, yang dapat Anda berikan saat runtime dengan biaya rendah
  2. Anda akan memiliki menu (meta) di satu tempat yang membuatnya bisa dipertahankan
  3. Jika Anda ingin menu Anda sepenuhnya mengandalkan 1: 1 pada rute Anda, itu dapat dicapai dengan menyediakan meta menu secara dinamis
  4. Jika konten Anda tumbuh (dan karenanya menjadi menu), Anda dapat memindahkan data ini ke dalam sesi yang dapat ditulis ke penyimpanan nilai kunci cepat
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.