2013-10-17 4 views
1

일반적으로 MVC 프레임 워크의 뷰 레이어에서 데이터베이스와 상호 작용하는 것이 좋습니까? 내가 Laravel 4 PHP - MVC 뷰 레이어 (Laravel Blade)에서 데이터베이스 사용

  • 을 사용하고

    • 나는 모든 웹 사이트의 페이지의 상단에있는 데이터베이스에서 일부 데이터를 표시합니다.
    • 내가 가지고 main.blade.php과 : @include("inc.header")

    내가 어떻게 올바른 방법으로 inc/header.php에서 데이터베이스에 연결할 수 있어야하는 경우?

    여기 여러 연결을 여기에 header.php에 만들고 싶지 않습니다. 내 페이지 컨트롤러에 하나를 연결하고 싶지 않습니다.

    저는 Laravel의 데이터베이스 방법 및 ORM보다 PDO에 대해 더 잘 알고 있습니다.

    아무쪼록 감사드립니다.

    편집

    친구는 좋은 조언과 MVC와 Laravel 워크 플로우에 대한 답변을했다,하지만 내 주요 관심사는 여기에 아직도있다.

    Ok 컨트롤러와 모델을 사용하여 필요한 데이터를 얻었습니다. 말했듯이 모든 페이지의보기 레이어에 있어야합니다. 따라서 모든 컨트롤러에서 동일한 데이터를 가져 오기 위해 동일한 작업을 반복해야합니다. 행위? (나는 그것이 확인 모델을 사용하고 계십니까? Laravel 필터에 DB를 사용하는 것입니다, 우리는 다시! 여기 필터를 가지고 그 이유는 추측?) 미리

    감사합니다 :)

  • +0

    "아니오"라고 말하면 일반적으로 View 계층에서 모델 논리를 갖는 것이 좋습니다. 보기에 필요한 것은 컨트롤러에서 가져와야하는 것입니다. – SamA

    +1

    제 의견으로는 컨트롤러가 모델 (이 경우 데이터베이스)에 대한 변경이나 처리 지시를 원할 것입니다. 그러나 프리젠 테이션 계층에 들어갈 준비가 된 모델에서 요청한 정보를 요청할 때 아무런 문제가 없습니다. – Crackertastic

    +0

    @Crackertastic 그는 모델 레이어에서 데이터를 요청하고 싶지 않습니다. 대신 그는 템플리트로 SQL 조회를 수행하려고합니다. 지난 번 내가 들었을 때, 그것은 기본적으로 스파게티 코드의 정의였습니다. –

    답변

    3

    뷰 레이어에서 데이터를 반복하는 것 이상을 수행하지 마십시오. 사용

    Route::get('/home', function() 
    { 
    
    //Here data is an array, normally you would fetch data 
    //from your database here and pass it to the View. 
    
    $data = array('this', 'is', 'my', 'data-array'); 
    return View::make('my.view')->with(compact('data'); 
    
    }); 
    

    그것은 모두 라우팅 계층으로 시작 (BTW laravel에 환상적입니다.)

    사용하여 폐쇄 : 기본적으로 laravel에서 정상적인 MVC 패턴은 다음과 같이 될 수있다 컨트롤러 (및 컨트롤러 방법)

    //the same route is bound to a controller method 
    Route::get('/home','[email protected]'); 
    

    Th

    <?php 
    
    class HomeController extends BaseController { 
    
        //The function you call from your route 
        public function myFunction() 
        { 
    
        $data = array('this', 'is', 'my', 'data-array'); 
        return View::make('my.view')->with(compact('data'); 
    
        } 
    
    } 
    

    위의 예는 단지 MVC에서 VC 보여 주지만, 일반적으로 동일한 방식으로 모델로부터 데이터를 전달 : 위의 전자 컨트롤러는이 같은 것을 볼 수 있었다. Heres는 빠른 하나

    : 컨트롤러

    public function myFunction($user) 
        { 
    
        $userdata = User::find($user)->orderBy('firstname', 'desc'); 
        $infodata = Event::find(1)->course; 
        return View::make('my.view')->with(compact('data', 'infodata'); 
    
        } 
    

    에서

    모델의 사용은 그래서 아이디어는 laravel은 여러 가지 방법으로 일을 할 수있다. 보조 앱이 있고 컨트롤러없이 관리 할 수 ​​있다고 확신하면 컨트롤러를 건너 뛸 수 있으며 모든 것을 라우팅 레이어에 보관할 수 있습니다.

    그러나 대부분의 응용 프로그램에서 컨트롤러는 응용 프로그램의 데이터 흐름을 제어하는 ​​데 필요합니다.

    MVC를 처음 사용하는 경우 주제에 대해 좀 알아보아야합니다.

    편집 :

    Ahaa! 따라서 모든 관점에서 데이터 일부를 공유하고 싶었습니다! 간단합니다. 모든 컨트롤러가 BaseController를 확장하기 때문에 거기에있는 데이터를 간단히 전달할 수 있습니다. 이렇게 :

    class BaseController extends Controller { 
    
         public function __construct() 
         { 
         $data = array('alot', 'of', 'data'); 
         return View::share('data', $data); 
         } 
        } 
    

    이제 데이터 변수를 모든보기에서 사용할 수 있습니다.

    추신. 필터는 물건을 걸러 내고, 어떤 것이 "괜찮은지"확인하는 것과 같습니다. 이것은 인증 된 사용자를 확인하거나 제출 양식을 작성하는 것을 포함 할 수 있습니다.

    +0

    감사합니다. 귀하의 답변은 제게 큰 도움이되었지만 제 편집문을 참조하십시오. – Webinan

    +0

    환상적입니다.) – Webinan

    1

    은 일반적으로 좋은 생각을인가 MVC 프레임 워크의 뷰 레이어에서 데이터베이스와 상호 작용합니까?

    아니요, 사용자는보기 레이어에서 데이터베이스 (모델)와 상호 작용하지 않습니다. MVC는 응용 프로그램의 로직, 응용 프로그램 데이터 및 비즈니스 규칙을 분리하기 위해 "Model View Controller"의 약자입니다.

    내가해야한다면, 어떻게 inc/header.php에서 올바른 방법으로 데이터베이스에 연결할 수 있습니까?

    여기서는 header.php에 하나의 연결을 만들고 내 페이지 컨트롤러에 하나의 연결을 만들고 싶지 않습니다.

    당신은 메인 레이아웃 (헤더 포함)를 만들고 응용 프로그램의 모든 페이지에 대한 레이아웃을 사용할 수

    :

    app/views/ 
        layouts/main.blade.php 
        page1.blade.php 
    

    레이아웃/main.blade.php :

    <html> 
    <head>...</head> 
    <body> 
    
        <div>Your header that will be included in each of your pages</div> 
    
        <!-- The content of the current page: --> 
        @yield('body') 
    
    </body> 
    </html> 
    

    page1.blade.php :

    ,

    Blade templating engine에 대해 자세히 알아보십시오.

    이제 데이터를 어디에서 가져 옵니까?

    개발하는 가장 빠르고 쉬운 방법은 컨트롤러로 경로를 사용하고 응용 프로그램이 발전함에 따라 코드를 리팩터링하고 컨트롤러를 만드는 것입니다.

    응용 프로그램/routes.php는 :

    Route::get('page1', function(){ 
    
        //Fetch your data the way you prefer: SQL, Fluent or Eloquent (Laravel ORM) 
        //$data = DB::select('select * from yourtable'); 
        $data = YourModel::all(); 
    
        //Pass your data to the view 
        return View::make('page1') 
        ->with('data', $data); 
    }); 
    

    데이터는 Fluent class 또는 Eloquent ORM를 사용하여 가져올 수 있습니다.

    응용 프로그램의 기본을 제대로 작성하려면 Laravel의 기본 사항을 배우고 나중에 유지 관리하기가 쉽습니다.

    +0

    매우 유용하며,'$ pdo = DB :: connection() -> getPdo(); $ stmt = $ pdo -> ...'? laravel close pdo connection은 어디에 있습니까? 마지막 단계에서보기의 끝에서? 내 편집을 참조하십시오. – Webinan

    2

    귀하의 경우와 같이 특히 편리한 솔루션이 있습니다. 모든 경로에 inc.header보기가 포함 된 경우 15 개 경로가 있는데 어디에서 볼 수 있는지 잘 알 수 있습니다. 여러 장소에서 데이터 논리를 반복하게됩니다. Patrik은 좋은 솔루션 인 BaseController를 사용하도록 제안했지만 작곡가를 선호합니다.

    View::composer('inc.header', function ($view) 
    { 
        $view->some_data = MyModel::where(...)->get(); 
    }); 
    

    그다지 쉽지 않습니다. :)

    1

    여기에 대한 답변과 문제는 그렇게 간단하지 않습니다. 먼저 MVC에 소개되었으며 기본 개념을 이해하려고 시도하면 MVC의 흐름은 Controller-> Model-> View입니다. 여기에서는 데이터가 모델에서보기로 직접 전달되는 것을 볼 수 있습니다. 현재 Laravel MVC를 사용하는 방법의 예는 모델이 컨트롤러에 데이터를 반환하여 흐름을 다음과 같이 만드는 것입니다. 컨트롤러 -> 모델 컨트롤러 ->보기. 여기서 우리는 모델과 뷰가 서로를 알지 못한다는 것을 알 수 있습니다. 위키 백과에 대한 qucik look은 이러한 유형의 모델링과 제어에 MVA가 있다는 것을 보여줍니다. A는 어댑터 용이며 중재 컨트롤러라고도 알려져 있으므로 이제 여기에 대한 답변으로 돌아갑니다. 우리는 MVA 또는 MVC를 사용해야합니까? Laravel에서 어떻게 진정한 MVC를 얻을 수 있습니까? 답변은 실제 MVC에 {{Form : model}} 파사드를 사용하는 것입니다. 그러나보기가 변경되면 어떻게됩니까? 우리는 새로운 데이터를 얻기 위해 모델을 model로부터 호출해야합니까? 대답은 '아니오'입니다.보기가 변경되어야한다면 사용자는 컨트롤러가 새로운 MVC주기를 시작하도록 유도해야합니다. Laravel 프레임 워크를 사용하여 MVC와 MVA를 혼합하여 여기에서 볼 수있는 것은 사이트의 필요에 따라 고도로 맞춤화 된 흐름을 얻을 수 있습니다.

    관련 문제