Laravel Controller - 在另一个函数内调用函数

时间:2017-12-14 20:44:01

标签: php laravel

从Laravel Controller中删除重复代码的最佳方法是什么?在我的特定情况下,我有Blog Controller,其中每个子页面都有多个功能(索引页面,关于,联系人,单个帖子页面......)。在任何这些函数中,我都有一些重复的代码。我可以创建一个特殊的函数,然后我可以调用任何函数吗?

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的东西?

3 个答案:

答案 0 :(得分:2)

你可以在Controller文件中创建另一个函数并调用它:




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




然后调用它:




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

公共函数getAbout(){
返回$ this-> foo('about-page');
}
  




如果你想创建一个函数可以在任何地方调用,您可以在类中创建 static 函数。例如:




 公共静态函数foo()
 {
返回“foo”;
}
  




然后调用它:

&#xA;&#xA; <预> <代码> NameOfClass :: foo的();&#XA; &#XA;

答案 1 :(得分: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);
}

答案 2 :(得分: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' => 'SomeController@showPage', 'view' => 'about-page']);
Route::get('contact', ['uses' => 'SomeController@showPage', 'view' => 'contact-page']);

只需投入一个“可以”完成的附加选项。

如果您有部分需要这些博客帖子,您可以通过删除查询并将其移动到视图编辑器来简化此方法:

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