【问题标题】:Laravel Controller - call function inside another functionLaravel Controller - 在另一个函数中调用函数
【发布时间】:2017-12-14 20:44:00
【问题描述】:

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

【问题讨论】:

  • 顺便说一句,这些“博客”是否像要在侧边栏或页脚中使用的帖子列表?那个侧边栏/页脚是它自己的部分吗?

标签: php laravel


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    你应该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);
    }
    

    【讨论】:

      【解决方案3】:

      您也可以选择将一些信息移动到路由定义中。

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

      【讨论】:

        猜你喜欢
        • 2011-10-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-17
        • 2013-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多