2013-04-17 3 views
0

단일 모델의 모든 행을 포함하는 선택 메뉴가 생성됩니다.이 작업을 수행하는 3 가지 솔루션이 있습니다.하지만 힘든 결정을 내리고 있습니다. 어느 것이 가장 합리적인 지, MVC/Laravel 모범 사례를 따릅니다.컨트롤러 내부에 논리 배치 뷰와 모델 비교

모델 상태

states table: 
id abbr name 
1  AL  Alabama 
2  AK  Alaska 
3  AZ  Arizona 
4  AR  Arkansas 
etc. 

솔루션 # 1 : 보거나 laravels를 사용하여 선택 메뉴를 생성하여 전달하는 제어부의 상태 어레이를 생성하는 로직을 수행 제어기 모델에서 모든 상태 검색 배열로 전달 된 폼 클래스.

* 컨트롤러 : my_controller.php *

public function get_index() 
{ 
    $states = State::all(); 
    foreach ($states as $state) 
    { 
     $states_array[$state->id] = $state->name; 
    } 
     return View::make('my_view')->with('states_array',$states_array); 
} 

* 전망 : my_view.php *

{{ Form::select('state_id',$states_array); }} 

솔루션 # 2 :이 컨트롤러 모델에서 모든 상태를 검색, 패스 조회 할 상태 모델을 검색하고, 상태 배열을 생성하는 로직을 수행하고 결과 배열과 함께 laravels 양식 클래스를 사용하여 선택 메뉴를 생성합니다.

* 컨트롤러 : my_controller.php *

public function get_index() 
{ 
    $states = State::all(); 
    return View::make('my_view')->with('states',$states); 
} 

* 전망 : my_view.php *

@foreach ($states as $state) 
    $states_array[$state->id] = $state->name; 
@endforeach 
{{ Form::select('state_id',$states_array); }} 

솔루션 # 3 :가) (AN all_array 추가 (또는 선택적으로 확장 all) 메소드를 모든 상태 레코드를 가져 오는 상태 모델에 연결하고, 논리를 작성하여 배열을 작성한 다음 결과 배열을 리턴합니다. 컨트롤러에서 메서드를 호출하고 뷰에 전달합니다. 배열로 전달 된 laravels 폼 클래스를 사용하여 선택 메뉴를 생성하십시오.

* 모델 : my_model.php *

public static function all_array() 
{ 
    $states = self::all(); 
    foreach ($states as $state) 
    { 
     $states_array[$state->id] = $state->name; 
    } 
    return $states_array; 
} 

* 컨트롤러 : my_controller.php *

public function get_index() 
{ 
    $states = State::all_array(); 
    return View::make('my_view')->with('states',$states); 
} 

* 전망 : my_view.php *

{{ Form::select('state_id',$states); }} 

그래서 이들 중 어떤 3 솔루션이 가장 적합하며 MVC/Laravel 모범 사례를보다 면밀히 따릅니다. 선택적으로 위에 설명 된 3보다 나은 솔루션이 있습니까?

모든 답변을 주시면 감사하겠습니다.

+1

일반적으로 모델을 여러 부분으로 나눕니다. 그 중 하나는 논리적 인 부분입니다. 유효성 검사, 데이터베이스 쿼리 및 필요한 경우 다른 요소도 포함됩니다. # 4로 새로운 솔루션을 제안 하겠지만 논리를 별도의 클래스에 두는 것이 좋습니다. (나중에 더 유지 보수 가능하게 만든다). – itachi

+0

@itachi 나에게 보여줄 수있는 어딘가의 예가 있습니까? – Yev

답변

2

옵션 하나를 사용했지만 모델의 lists() 메소드를 사용하여 단순화했습니다.

$states_array = State::lists('name', 'id'); 

찾고있는 어레이가 생성됩니다.

+0

완벽한 - 이것은 내가 필요한 것입니다! – Yev

1

해결책 # 3과 함께 갈 것입니다. 모델이 ORM 방식으로 동작해야하는 이유는 없습니다. 상태의 전체 목록을 검색하는 것이 공통된 활동 인 경우 반드시 모든 것을 모델 클래스에 추가하십시오. 그런 식으로 특정 국가를 제외하는 등의 작업을해야하는 경우 한 곳에서 변경할 수 있습니다.

0

나는 이러한 솔루션을 사용하지 않을 것입니다. 프리젠 테이션 로직을 래핑하고 뷰 밖으로 유지하려면 표현 자 패턴을 구현해야합니다. 이것을 모델로 유지하는 것이 아마도 가장 좋은 방법 일 것이지만, 이상적으로는 도메인 로직을 프리젠 테이션 로직과 분리하여 유지하는 것이 이상적입니다.

일부 presenter bundles이 있으며 Laravel 4에는 일부 presenter packages도 있습니다.

논리를 분리하는 습관을 얻는 것이 좋습니다. 특히보기에서 많은 프리젠 테이션 논리를 수행하고 있다는 것을 깨달을 때 더욱 그렇습니다.

그러나 분명히 알기 위해 가장 좋은 방법은 위에서 설명한대로 lists() 방법을 사용하는 것입니다. 아직 발표자에게 생각을 전하십시오.