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

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

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

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

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

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

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

редактировать

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

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

Заранее спасибо 🙂

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

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

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

Тогда это становится намного легче. 🙂

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

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

Если нужно, как правильно подключиться к базе данных из 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 templating .

Теперь, где вы извлекаете данные?

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

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, чтобы правильно создать базу вашего приложения, поэтому в будущем это будет очень просто поддерживать.

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