2017-12-14 5 views
1

Was ist der beste Weg, um doppelte Codes von Laravel Controller zu entfernen? In meinem speziellen Fall habe ich Blog-Controller, wo mehrere Funktionen für jede der Unterseiten (Indexseite, etwa, Kontakt, einzelne Post-Seite ...) sind. In jeder dieser Funktionen habe ich einen Code, der wiederholt wird. Kann ich eine spezielle Funktion erstellen, die ich dann in irgendeine Funktion aufrufen könnte?Laravel Controller - Aufruf Funktion in einer anderen Funktion

class BlogController extends Controller { 

    public function getIndex() { 
     $blogs = Blog::orderBy('id', 'desc')->where('status', '1')->paginate(3); 
     return view('index-page')->withBlogs($blogs); 
    } 

    public function getAbout() { 
     $blogs = Blog::orderBy('id', 'desc')->where('status', '1')->paginate(3); 
     return view('about-page')->withBlogs($blogs); 
    } 

} 

Und nun, ich doppelten Code entfernen möge mit einer speziellen Funktion zu schaffen (mein Code nur Beispiel ist, ist der eigentliche Code wiederholte viel länger). Ist das überhaupt möglich? Gibt es einen anderen Weg, als eine andere Funktion zu erstellen? Vielleicht kann ich etwas wie function.php in Wordpress erstellen?

+0

btw sind diese Blogs 'wie eine Liste der Beiträge zu verwenden in einer Seitenleiste oder Fußzeile? Ist das Sidebar/Footer ein eigenes Partial? – lagbox

Antwort

2

Sie können eine andere Funktion in Controller-Datei erstellen und rufen:

private function foo($view) 
{ 
    $blogs = Blog::orderBy('id', 'desc')->where('status', '1')->paginate(3); 
    return view($view)->withBlogs($blogs); 
} 

Und dann nennen:

public function getIndex() { 
    return $this->foo('index-page'); 
} 

public function getAbout() { 
    return $this->foo('about-page'); 
} 

Wenn Sie eine Funktion erstellen möchten, die überall aufgerufen werden kann, können Sie Erstellen Sie eine static-Funktion in einer Klasse. Ex:

public static function foo() 
{ 
    return "foo"; 
} 

und dann rufen:

NameOfClass::foo(); 
1

Sie sollten move the data related logic into a repository or a model und bekommen die Daten wie folgt aus:

public function getIndex() 
{ 
    return view('index-page', ['blogs' => $this->blog->paginateLatest()]); 
} 

Und im Blog Modell:

public function paginateLatest() 
{ 
    return $this->latest('id')->where('status', 1)->paginate(3); 
} 
0

Sie haben die Möglichkeit, einige Informationen auch in die Routendefinition zu verschieben.

class SomeController ... 
{ 
    public function showPage(Request $request) 
    { 
     return view(
      $request->route()->getAction('view'), 
      ['blogs' => Blog::orderBy('id', 'desc')->where('status', '1')->paginate(3)] 
     ); 
    } 
} 

Route::get('about', ['uses' => '[email protected]', 'view' => 'about-page']); 
Route::get('contact', ['uses' => '[email protected]', 'view' => 'contact-page']); 

Nur eine zusätzliche Option hinzufügen, die "getan werden kann".

Wenn Sie einen Teil, die diese Blog-Posts muss man diese Methode, indem die Abfrage vereinfachen kann und es in eine Ansicht Komponisten bewegt:

public function showPage(Request $request) 
{ 
    return view($request->route()->getAction('view')); 
} 

View::composer('some.partial.that.needs.those.blog.posts', function ($view) { 
    $view->with(
     'blogs', 
     Blog::orderBy('id', 'desc')->where('status', '1')->paginate(3) 
    ); 
}); 
Verwandte Themen