메뉴 건물 패턴


9

메뉴를 라우팅에 사용하지 않을 때 메뉴의 활성 상태 처리를 둘러 보는 데 문제가 있습니다.

메뉴 시스템도 라우팅을 처리하는 Drupal에서 왔습니다. 따라서 활성 상태 및 활성 트레일 상태 설정은 경로 (메뉴 렌더링 시스템의 역할도 함)에 의해 처리됩니다.

이제 많은 PHP 프레임 워크에는 라우팅을 처리하는 라우터 클래스가 있습니다. 메뉴가 POST를 인식해서는 안되기 때문에 이것은 분리가 잘되는 것 같습니다 || 옵션 || ... 요청.

그러나 프론트 엔드를 작성할 때 메뉴를 열심히 코딩하는 것을 발견했습니다. 또는 DB에 모든 것을 저장하고 해당 값을 뷰에 전달합니다. 이 접근 방식이 마음에 들지 않는 것은 라우터에 이미 작성한 내용의 사본을 만들고 있지만 Menu 클래스를 사용하고 있다는 것입니다.

예를 들면 :

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

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

당신은 여기서 우려를 분리하고 있습니다. 그러나 메뉴는 활성 상태를 설정하기 위해 경로에 크게 의존합니다. 메뉴는 또한 활성 트레일을 설정하기 위해 계층에 대해 알아야합니다.

예, 활성 트레일 및 활성 상태 클래스를 설정하는 것은 실제로 볼만한 일입니다. 하지만

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

모든 견해가 바보처럼 보입니다. 그런 다음 성가신 액티브 트레일을 모두 추가하면 실제 팽창입니다. 뷰가 렌더링되기 전에 처리하고 active-trail 플래그를 true로 설정하면 내가 아는 방식이 너무 추한 것 같습니다 (모든 자식을 반복하는 모든 자식을 반복하는 foreach, ...)

내 질문은 :

이 청소기를 더 좋게 만드는 패턴이나 현명한 방법이 있습니까? ... 액티브 트레일 '문제'를 어떻게 처리해야합니까?

나는 아이-> 부모를 렌더링하려고 생각했습니다. 광고에서 가장 깊은 수준으로 시작한 다음 내 방식대로 작업하십시오. 그러나 그 아이는 부모에 대해 알지만 부모는 그의 아이에 대해 아무것도 알지 못합니다 (이상한 것처럼 보입니다).

답변:


1

메뉴가 라우팅에 사용되지 않을 때

메뉴에 라우팅을 사용할 수 있다고 말하고 싶습니다 .


이미 지적했듯이 라우터는 연결하기에 좋은 장소입니다. 각 요청에서 현재 페이지의 메뉴 메타를 평가하는 후크를 사용하는 것이 추한 생각은 아닙니다.

뷰가 활성 상태를 추적하도록하는 경우 우려를 분리하지 않습니다. 보기는 원하는대로 수행해야하지만 메뉴 상태를 관리 할 필요는 없습니다. 메뉴 메타 데이터는 일반적으로 응용 프로그램 전체와 동일하며 사용자가 자신을 찾고 메뉴를 렌더링 할 수있는 경로 만 있으면됩니다.

라우터와 필요에 따라 정적 메뉴 메타 데이터를 사용하는 간단한 함수 또는 클래스가 필요하며 현재 경로는 나중에 필요한 모든 정보를 제공하기에 충분합니다.

메뉴 메타 자체는 반드시 객체 일 필요는 없습니다. 대부분의 경우 방법이없는 간단한 키 값 데이터 구조로 충분합니다.

후크는 빵 부스러기, 깊이, 상위 페이지 또는 현재 페이지와 같이 메뉴와 관련된 몇 가지 공통 기능을 가진 상태 객체를 생성하고이 객체를 http 요청의 맥락에서 알려줍니다. 후크 내부에는 다양한 가능성이 있지만 일반적으로 필요한 데이터를 수집, 준비 및 처리하는 방법을 알고있는 데이터로 전달하는 것입니다.

이 접근 방식은 필요에 따라 확장되며 몇 가지 장점이 있습니다.

  1. 데이터베이스는 저렴한 비용으로 런타임에 제공 할 수있는 데이터를 처리 할 필요가 없습니다.
  2. 한 곳에서 메뉴 (메타)를 유지 관리 할 수 ​​있습니다.
  3. 메뉴가 경로에 완전히 1 : 1로 의존하도록하려면 메뉴 메타를 동적으로 제공하면됩니다.
  4. 컨텐츠가 커지면 (따라서 메뉴)이 데이터를 세션으로 이동하여 빠른 키 값 저장소에 기록 할 수 있습니다
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.