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!
Ich weiß das aber ich muss auch die Daten zur Ansicht schieben und das ist was ich wissen will wie ich das machen kann ... –