2017-01-03 4 views
0

Zuerst möchte ich sagen, dass es das erste Mal für mich mit einem PHP-Framework und MVC funktioniert und ich habe noch nicht alle Antworten auf meine Probleme gefunden. Ich benutze Laravel 5.3 im Moment.PHP MVC Verständnis Hilfe (Laravel 5.3)

Problem: Ich habe eine Website, wo ein Benutzer anmelden kann und ein paar Seiten (ich benutze Laravel Auth) und auf vielen Seiten habe ich eine Sidebar, die jedes Mal gleich ist. Dann habe ich auf jeder Seite etwas Inhalt, der anders ist (etwa, Artikel, ...). Ich habe gehört, dass das Wichtigste ist, dass du niemals Code zweimal schreiben solltest und da ist das Problem. Auf dieser Seitenleiste gibt es einen "Dienst", der dem Benutzer Inhalt anzeigt, aber um dies anzuzeigen, habe ich einen Algorithmus, der die Benutzerdaten vom authentifizierten Benutzer benötigt und die Auth-Funktion ist in Laravel 5.3 ServiceProvider oder BaseController nicht verfügbar und wurde nie dazu gedacht Sein.

Meine Frage ist jetzt, wie kann ich das sauber machen?

Einige Codes es besser zu verstehen:

Routen:

Route::get('/community/ranking', 'Pages\[email protected]'); 
Route::get('/community/advertising', 'Pages\[email protected]'); 
Route::get('/logout', '[email protected]'); 
Route::get('/home', 'Pages\[email protected]'); 

Dann habe ich für jede Seite eine eigene Steuerung, die den Inhalt dieser Seite dient (mit Ausnahme der Sidebar - noch keine Lösung) .

Homecontroller:

<?php 
namespace App\Http\Controllers\Pages; 

use App\Http\Controllers\BaseController; 
use Redis; 
use App\Http\Requests; 
use Request; 
use Shoutbox; 
use User; 

class HomeController extends BaseController 
{ 
function getView() 
{ 
    $shoutboxData = $this->getShoutboxData(); 

    return view('pages.home', compact('shoutboxData')); 
} 

private function getShoutboxData() 
{ 
    $shoutbox = Shoutbox::orderBy('time', 'DESC')->skip(0)->take(15)->get(); 

    if(count($shoutbox) > 0) 
    { 
     foreach($shoutbox as $entry) 
     { 
      $getUser = User::where('id', '=', $entry->user_id)->first(); 

      $entry['username'] = $getUser->username; 
      $entry['look'] = $getUser->look; 

      $shoutboxData[] = $entry; 
     } 
    } 
    else 
    { 
     $shoutboxData = null; 
    } 

    return $shoutboxData; 
} 

public function systemMessage() 
{ 
    $redis = Redis::connection(); 

    $redis->publish('chat.message', json_encode([ 
     'msg'  => 'System message', 
     'nickname' => 'System', 
     'system' => true, 
    ])); 
} 
} 

Jetzt diene ich der Ansicht, in jedem, eigene Controller und den Inhalt dieser Seite (zum Beispiel Shoutbox, news) ist auch in diesem Controller. (Nicht sehr sauber meiner Meinung nach, aber fand keinen besseren Weg. Etwas, das ich hier verbessern kann?).

Ich kann den Sidebar-Inhalt auf jedem Controller bedienen, aber das ist nicht was ich will. Wie kann ich das machen? Benutze ich MVC richtig?

Vielen Dank im Voraus!

Antwort

1

Da Sie das Laravel Blade-Vorlagensystem verwenden, können Sie Ihre Ansichtslogik in separate Blade-Dateien aufteilen.

Ihre Sidebar ist gemeinsam, jede Seite so wird diese Datei in Ihrem Layout setzen (Ressourcen/Ansichten/Layouts/app.blade.php) stellen die Logik vor

<div class="container" id="app"> 
    @yield('content') 
</div> 

Jetzt in Ihrem Blade-Dateien für jede einzelne Seite erstrecken sich nur die Layout-Vorlage die Sie gerade erstellt:

@extends('layouts.app') 

@section('content') 

<h1>page content goes here</h1> 

@endsection 

Jetzt kann jeder Ihrer Blade-Dateien, die die layouts.app verlängern wird in ihnen die Sidebar Logik haben.


EDIT: Mit den zusätzlichen Informationen zur Verfügung gestellt .... tun, wie ich oben gesagt, sondern auch einen Blick Komponist erstellen, geben Sie die vollständige Dokumentation finden Sie hier: https://laravel.com/docs/5.3/views#view-composers

Erstellen Sie eine Ansicht Komponist für Ihre Haupt Layout (oder Sidebar-Layout, wenn Sie stattdessen Layouts erweitern) und übergeben Sie Ihre Daten innerhalb der Ansicht Composer, die Dokumentation gibt gute Beispiele, so ändern Sie das für Ihre eigene Sidebar.

+0

Ich weiß das aber ich muss auch die Daten zur Ansicht schieben und das ist was ich wissen will wie ich das machen kann ... –