1

在 MVC 框架的视图层中与数据库交互通常是一个好主意吗?

  • 我正在使用 Laravel 4。
  • 我想在所有网站页面的顶部显示来自数据库的一些数据。
  • 我有一个main.blade.php和:@include("inc.header")

如果应该,我怎样才能以正确的方式连接到数据库inc/header.php

我不想在我的页面控制器中建立多个连接,一个在此处,header.php另一个在我的页面控制器中。

我比 Laravel 的数据库方法和 ORM 更熟悉 PDO。

任何建议表示赞赏!

编辑

朋友们对 MVC 和 Laravel 工作流程给出了很好的建议和答案,但我的主要关注点仍然在这里。

好的,我已经使用控制器和模型来获取所需的数据,然后正如我所说,它应该存在于每个页面的视图层中,那么我是否应该重复相同的任务以在所有控制器的操作中获取相同的数据?(我想这就是我们在这里有过滤器的原因!再说一次,在 Laravel 过滤器中使用 db 可以吗?使用模型?)

提前致谢 :)

4

4 回答 4

3

除了遍历视图层中的数据外,不要做任何事情。基本上,laravel 中的普通 MVC 模式可能是这样的:

这一切都始于路由层(顺便说一句,在 laravel 中很棒)

使用闭包

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');

});

使用控制器(和控制器方法)

//the same route is bound to a controller method
Route::get('/home','HomeController@myFunction');

上面的控制器可能看起来像这样:

<?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,但通常你以同样的方式从你的模型中传递数据。

这是一个快速的:

控制器中的模型使用

  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 完全陌生,您应该查看一些关于该主题的 tuts。

编辑:

啊哈!因此,您想在所有视图中共享一些数据!那很简单。因为您所有的控制器都扩展了 BaseController,您可以简单地在其中传递数据。像这样:

    class BaseController extends Controller {

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

现在数据变量在所有视图中都可用。

PS。过滤器旨在过滤东西,例如检查某些东西是否“正常”。这可能包括检查经过身份验证的用户或表单提交等。

于 2013-10-18T08:42:44.090 回答
2

对于像您这样的情况,还有另一种解决方案特别方便。如果您有 15 条路线最终都包含 inc.header 视图……那么您可以看到它的发展方向。您将在多个地方重复数据逻辑。Patrik 建议使用 BaseController,这是一个很好的解决方案,但我更喜欢使用作曲家。

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

这并没有变得容易得多。:)

于 2013-10-18T14:23:42.423 回答
1

在 MVC 框架的视图层中与数据库交互通常是一个好主意吗?

不,您不会在视图层中与数据库(模型)进行交互。MVC 代表“模型视图控制器”,用于分离应用程序的逻辑、应用程序数据和业务规则。

如果应该,我怎样才能以正确的方式从 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

@extends('layouts.main')

@section('body')
  <div>The content of your page</div>
@stop

了解有关Blade 模板引擎的更多信息。

现在你在哪里获取你的数据?

最快/最简单的开发方法是将路由用作控制器,随着应用程序的发展,您开始重构代码并创建控制器。

应用程序/路由.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 类Eloquent ORM获取数据。

我建议您学习 Laravel 的基础知识以正确创建应用程序的基础,以便将来非常容易维护。

于 2013-10-18T07:29:09.920 回答
1

这里的答案和问题并不是那么简单。首先刚刚介绍了MVC并试图理解基本概念,MVC的流程是Controller->Model->View。在这里我们看到数据是从模型直接传递到视图的。当前如何使用 Laravel MVC 的示例是让模型将数据返回到控制器,使流程如下:Conntroller->Model-Controller->View。在这里,我们看到模型和视图彼此不知道。维基百科上的快速浏览表明,这种类型的建模和控制已知具有 MVA。A 代表适配器,也称为中介控制器,所以现在我们回到这里的答案。我们应该使用 MVA 还是 MVC?如何在 Laravel 中实现真正的 MVC?答案是为真正的 MVC 使用 {{Form:model}} 外观。但是,如果视图发生变化会发生什么?我们应该从视图中调用模型来获取新数据吗?答案是否定的,如果视图必须改变,那么用户应该让控制器做出反应,开始新的 MVC 循环。所以我们可以看到这里混合使用 Laravel 框架的 MVC 和 MVA,可以实现基于站点需求的高度定制化的流程。

于 2015-10-26T10:48:20.993 回答