Padrão de construção de menu


9

Estou tendo problemas para resolver o manuseio do estado ativo de um menu quando o menu não é usado para roteamento.

Eu venho do Drupal, onde o sistema de menus também lida com o roteamento. portanto, definir o estado ativo e o estado da trilha ativa é tratado pela rota (que também atua como um sistema de renderização de menu).

Agora, muitas estruturas PHP têm classes de roteador que lidam com o roteamento. Parece uma boa separação, pois um menu não deve estar ciente do POST || OPÇÕES || ... solicitações de.

Mas, ao escrever o frontend, encontrei-me codificando o menu. Ou armazenando tudo no banco de dados e passando esses valores para uma exibição. O que eu não gosto dessa abordagem é que você está criando uma cópia do que já escreveu no seu roteador, mas agora usando a classe Menu.

Um exemplo:

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

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

Você está separando preocupações aqui, então isso é legal. Mas o Menu depende muito da Rota para definir seu estado ativo. O menu também precisará saber sobre hierarquia para definir a trilha ativa.

Então, sim, definir trilhas ativas e classes de status ativas é realmente uma coisa de visualização. Mas ter

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

em todos os seus pontos de vista parece estúpido. Em seguida, adicione todos os ifs irritantes da trilha ativa e isso é um verdadeiro inchaço. Lidar com isso antes que a exibição seja processada e definir um sinalizador de trilha ativa como verdadeiro parece tão feio do jeito que eu sei (um foreach repetindo todas as crianças que repetem todas as crianças, ...)

Minha pergunta é:

Existe um padrão ou uma maneira inteligente de obter este limpador, melhor, ...? Como lidar com o 'problema' da trilha ativa?

Eu estava pensando em renderizar filho -> pai. Então comece com o anúncio no nível mais profundo e depois suba. Mas então a criança sabe sobre seus pais, mas os pais não sabem nada sobre seus filhos (parece estranho).

Respostas:


1

quando o menu não é usado para roteamento

Eu diria que o roteamento pode ser usado para o menu.


Como você já apontou, o roteador seria um bom lugar para se conectar. Não acho que seria feio usar um gancho que avalie a meta do menu da página atual em cada solicitação.

Se você responsabiliza seus pontos de vista pelo rastreamento do estado ativo, não separa as preocupações. As visualizações devem fazer o que forem feitas - mas não é necessário que eles também gerenciem o estado do menu. Os metadados do menu geralmente são os mesmos em todo o aplicativo e você só precisa da rota para poder se localizar e renderizar o menu.

Dependendo do seu roteador e das suas necessidades, uma função ou classe simples que utiliza alguns metadados estáticos do menu e a rota atual seriam suficientes para fornecer todas as informações necessárias posteriormente.

A meta do menu em si não deve necessariamente ser um objeto. Uma estrutura de dados simples de valor-chave sem métodos deve ser suficiente na maioria dos casos.

O gancho pode criar um objeto de estado com algumas funcionalidades comuns relacionadas ao seu menu, como trilhas de navegação, profundidade, página pai ou página atual e tornar esse objeto conhecido no contexto de sua solicitação http. Você tem diferentes possibilidades dentro do gancho - mas geralmente trata-se de coletar, preparar e passar os dados necessários para algo que saiba lidar com eles.

Essa abordagem se adapta às suas necessidades e tem algumas vantagens:

  1. Seu banco de dados não precisa lidar com dados, que você pode fornecer em tempo de execução com baixos custos
  2. Você terá seu menu (meta) em um só lugar, o que o torna sustentável
  3. Se você deseja que o seu menu confie completamente 1: 1 em suas rotas, isso pode ser alcançado fornecendo menu dinamicamente
  4. Se o seu conteúdo aumentar (e, portanto, o menu), você poderá mover esses dados para a sessão, que podem ser gravados em um armazenamento rápido de valores de chave
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.