2017-12-14 137 views
1

Laravel Controllerから重複したコードを削除する最適な方法は何ですか?私の場合、Blog Controllerはサブページ(インデックスページ、about、連絡先、シングルポストページ...)ごとに複数の機能を持っています。これらの関数の中には、繰り返されるいくつかのコードがあります。特別な関数を作成して、関数のいずれかに呼び出すことはできますか?Laravelコントローラ - 別の関数内で関数を呼び出す

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); 
    } 

} 

そして、今、私は特別な機能を作成すると、重複コードを削除したい(私のコードは一例であり、実際の繰り返しコードがはるかに長いです)。それも可能ですか?別の関数を作成する以外にもいくつかの方法がありますか?多分私はWordpressでfunction.phpのようなものを作成することができますか?

+0

はところで、使用するポストのリストのように、これらのブログ」でありサイドバーやフッターで?サイドバー/フッター自体の部分ですか? – lagbox

答えて

2

あなたはコントローラファイル内の別の関数を作成し、それを呼び出すことができます。

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

そしてそれを呼び出す:

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

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

あなたはどこにでも呼び出すことができる関数を作成したい場合は、することができますクラス内にstatic関数を作成します。例:

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

し、それを呼び出す:

NameOfClass::foo(); 
1

あなたはすべきmove the data related logic into a repository or a modelと、このようなデータ取得:

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

そしてBlogモデルで:

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

いくつかの情報をルート定義にも移動するオプション。

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']); 

「できる」というオプションを追加するだけです。

あなたはこれらのブログの記事を必要としている部分がある場合は、クエリを削除し、View Composerの中にそれを移動することで、この方法を簡素化することができます。

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) 
    ); 
}); 
関連する問題