代码之家  ›  专栏  ›  技术社区  ›  ptvty

PHP-在MVC视图层中使用数据库(Laravel Blade)

  •  1
  • ptvty  · 技术社区  · 12 年前

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

    • 我用的是拉拉威尔4。
    • 我想在所有网站页面的顶部显示数据库中的一些数据。
    • 我有一个 main.blade.php 以及: @include("inc.header")

    如果应该,我如何从连接到数据库 inc/header.php 以正确的方式?

    我不想在这里建立多个连接 header.php 还有一个在我的页面控制器中。

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

    欢迎提出任何建议!

    编辑

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

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

    提前感谢:)

    4 回复  |  直到 9 年前
        1
  •  3
  •   pat    12 年前

    永远不要做任何事情,只需在视图层中循环浏览数据。基本上,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的新手,你应该看看关于这个主题的教程。

    编辑:

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

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

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

    PS。过滤器是用来过滤东西的,比如检查某些东西是否“正常”。这可能包括检查认证用户或表单提交等。

        2
  •  2
  •   Collin James    12 年前

    对于像您这样的案例,还有另一种特别方便的解决方案。如果你有15条最终都包含inc.header视图的路由。。。好吧,你可以看到这是怎么回事。您将在多个地方重复数据逻辑。Patrik建议使用BaseController,这是一个很好的解决方案,但我更喜欢使用composer。

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

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

        3
  •  1
  •   FR6    12 年前

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

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

    如果应该,我该如何以正确的方式从inc/header.php连接到数据库?

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

    您可以创建一个主布局(包含页眉),并将此布局用于应用程序的所有页面:

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

    布局/ 主叶片.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>
    

    页面1.blade.php :

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

    了解有关的更多信息 Blade templating engine .

    现在你从哪里获取数据?

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

    应用程序/ 路由.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的基本知识,以便正确地创建应用程序的基础,这样它在未来将非常容易维护。

        4
  •  1
  •   Ken Gee    10 年前

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