PHP — использовать базу данных в слое представления MVC (Laravel Blade)

Как правило, рекомендуется взаимодействовать с базой данных на уровне представления в рамках MVC?

  • Я использую Ларавель 4.
  • Я хочу показать некоторые данные из базы данных вверху всех страниц сайта.
  • У меня есть main.blade.php и: @include("inc.header")

Если я должен, как я могу правильно подключиться к базе данных из inc/header.php?

Я не хочу делать несколько подключений, одно здесь, в header.php, и одно в моих контроллерах страниц.

Я лучше знаком с PDO, чем с методами баз данных Laravel и ORM.

Любой совет приветствуется!

Изменить

Друзья дали хорошие советы и ответы о рабочем процессе MVC и Laravel, но моя главная забота все еще здесь.

Хорошо, я использовал контроллеры и модели для получения необходимых данных, а затем, как я уже сказал, он должен присутствовать для уровня представления на каждой странице. Так должен ли я повторять ту же задачу, чтобы получить те же данные во всех действиях моих контроллеров? (Я думаю, именно поэтому у нас здесь есть фильтры! Опять же, можно ли использовать db в фильтрах Laravel? используя модель?)

Заранее спасибо :)


person Webinan    schedule 17.10.2013    source источник
comment
Я бы сказал, что нет, как правило, не рекомендуется иметь логику модели на уровне представления. То, что нужно представлению, должно быть получено от контроллера.   -  person SamA    schedule 17.10.2013
comment
На мой взгляд, вы хотите, чтобы ваш контроллер инструктировал любые изменения или обработку вашей модели (в данном случае базы данных). Однако я не вижу проблем в том, чтобы позволить вашему представлению запрашивать информацию из модели, которая готова к работе на уровне представления.   -  person Crackertastic    schedule 17.10.2013
comment
@Crackertastic, он не хочет запрашивать данные со слоя модели. Вместо этого он хочет выполнять запросы SQL с шаблонами. В прошлый раз, когда я слышал, это было в основном определение спагетти-кода.   -  person tereško    schedule 18.10.2013
comment
@tereško Точно! Ха-ха   -  person Webinan    schedule 18.10.2013
comment
@teresko Я понял просьбу ОП. Но пост также закончился Любые советы приветствуются. Поэтому я дал несколько советов и порекомендовал обработку ручки контроллера.   -  person Crackertastic    schedule 18.10.2013


Ответы (4)


Никогда не делайте ничего, кроме циклического просмотра ваших данных в слое просмотра. В основном нормальный шаблон MVC в laravel может быть примерно таким:

Все начинается со слоя маршрутизации (который, кстати, просто фантастический в 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');

  }

}

В приведенном выше примере просто показан VC в MVC, но обычно вы передаете данные из своих моделей таким же образом.

Вот быстрый:

Использование модели в контроллерах

  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. Фильтры предназначены для фильтрации вещей, например, для проверки того, что определенные вещи «в порядке». Это может включать в себя проверку авторизованных пользователей, отправку форм и т. д.

person stormpat    schedule 18.10.2013
comment
Спасибо, ваш ответ был очень полезен для меня, но, пожалуйста, посмотрите мое редактирование. - person Webinan; 18.10.2013

Есть еще одно решение, которое особенно удобно для таких случаев, как ваш. Если у вас есть 15 маршрутов, все из которых в конечном итоге включают представление inc.header... ну, вы можете увидеть, к чему все идет. Логика данных будет повторяться в нескольких местах. Патрик предложил использовать BaseController, что является хорошим решением, но я предпочитаю использовать композитор.

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

Это не становится намного легче, чем это. :)

person Collin James    schedule 18.10.2013

Как правило, рекомендуется взаимодействовать с базой данных на уровне представления в рамках MVC?

Нет, вы не взаимодействуете со своей базой данных (моделью) на уровне представления. MVC означает «Контроллер представления модели» для разделения логики, данных приложения и бизнес-правил вашего приложения.

Если я должен, как я могу правильно подключиться к базе данных из inc/header.php?

Я не хочу делать несколько соединений, одно здесь, в header.php, и одно в моих контроллерах страниц.

Вы можете создать основной макет (содержащий ваш заголовок) и использовать этот макет для всех страниц вашего приложения:

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

layouts/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.

Теперь, где вы получаете ваши данные?

Самый быстрый/простой способ разработки — использовать маршруты в качестве контроллеров, и по мере развития вашего приложения вы начинаете рефакторинг своего кода и создаете контроллеры.

app/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 или Eloquent ORM.

Я предлагаю вам изучить основы Laravel, чтобы правильно создать основу вашего приложения, чтобы в будущем его было действительно легко поддерживать.

person FR6    schedule 18.10.2013
comment
очень полезно, а как насчет $pdo = DB::connection()->getPdo(); $stmt = $pdo->... ? где laravel закрывает соединение pdo? в конце просмотра как последний шаг? Пожалуйста, смотрите мое редактирование. - person Webinan; 18.10.2013

Ответ и вопрос здесь не так прост. Сначала мы только что познакомились с MVC и попытались понять основную концепцию, поток для MVC — это Controller-> Model-> View. Здесь мы видим, что данные передаются из модели напрямую в представление. Текущие примеры того, как использовать Laravel MVC, - это заставить модель возвращать данные контроллеру, создавая поток следующим образом: Conntroller-> Model-Controller-> View. Здесь мы видим, что модель и представление не знают друг о друге. Беглый взгляд на Википедию показывает, что этот тип моделирования и управления, как известно, имеет MVA. A для адаптера, также известного как промежуточный контроллер, так что теперь мы вернемся к ответу здесь. Должны ли мы использовать MVA или MVC? Как добиться настоящего MVC в Laravel? Ответ заключается в использовании фасада {{Form:model}} для истинного MVC. Но что тогда произойдет, если представление изменится? должны ли мы вызывать модель из представления, чтобы получить новые данные? Ответ - нет, если представление должно измениться, пользователь должен был вызвать реакцию контроллера, запускающую новый цикл MVC. Итак, то, что мы видим здесь, — это сочетание MVC и MVA с использованием фреймворка Laravel, которое может обеспечить настраиваемый поток в зависимости от потребностей сайта.

person Ken Gee    schedule 26.10.2015