Laravel使用单独的控制器进行单独的逻辑

时间:2017-09-15 03:34:09

标签: php laravel frameworks

我认为我们有独立的控制器分别对应我们应用程序的逻辑或模块,我也发现在另一个控制器中使用控制器不是一个好习惯。

这里我遇到了困难。

有两个控制器PagesController和PostsController

PagesController处理所有相关任务的页面。

class PagesController 
{

    public function index()
    {
         // method of our root request, get and show all posts
    }

    public function contactUs()
    {
        // show contact us page etc.
    }

}

PostsController处理所有帖子相关的任务。

class PostsController
{

     public function getPosts() {} // get all posts from database
     public function deletePost($id) {} // delete a post
     public function editPost($id) {} // edit a post
}

现在发布控制器处理所有帖子特定任务和页面控制器处理所有页面相关任务。问题是我想使用posts控制器getPosts()方法来获取所有帖子并将它们传递给视图。如何在PagesController index()方法中使用PostsController的getPosts()方法。

一种方法是扩展PostsController并使用它。但是如果我们想要使用另一种控制器的方法呢?

请为我提供更好的方法。

5 个答案:

答案 0 :(得分:1)

https://www.youtube.com/watch?v=MF0jFKvS4SI

这个谈话对于控制器来说有点先进,但对于控制器来说肯定是一个很好的做法。

答案 1 :(得分:0)

更好地创造一个特质...... How to use traits in Laravel 5.4.18?

答案 2 :(得分:0)

您可以通过以下方式在任何控制器中使用XyzController方法

use App\Http\Controllers\XyzController ;

class AnyController extends Controller {

    public function functionName()
    {
        $result = (new XyzController)->methodName();
        // this will call method of XyzController
    }
}

希望这会有所帮助。

答案 3 :(得分:0)

您的控制器不应该有任何逻辑。在Repository中创建服务或创建方法,并将PostsController的getPosts()代码移动到此方法中。然后在PostsController和PageController中调用这个新方法。

拥有Repository的重点是为了这个目的。

答案 4 :(得分:0)

我通常更喜欢Repository模式来完成任务。

这是一个概述。

interface BaseMethodsForRepository {
    /**
     * @return mixed
     */
    public function get();

    //other base methods like store (handle create/update in common method) and delete.

}


class PostRepository implements BaseMethodsForRepository  {
    public function get() {
        return Post::all();
    }

    //Many more methods
}


class PagesRepository implements BaseMethodsForRepository  {
    public function get(){
        return Page::all();
    }
}

class PageController {
    private $postRepository
    public function __construct(PostRepository $postRepository) {
        $this->postRepository = $postRepository;
    }

    public function index(){
        //here you can use all public methods of PostRepository
        //usage
        $post = $this->postRepository->get(); 
    }
}

我发现这很有用,代码可以重复使用。