Laravel使用单独的控制器为单独的逻辑

问题描述:

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

在这里,我面临着一个困难。

有两个控制器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 
} 

现在后控制器处理所有职位的具体任务和页面控制器处理所有页面相关的任务。问题是,我想使用帖子控制器getPosts()方法来获取所有帖子并传递给他们查看。我如何在我们的PagesController index()方法中使用PostsController的getPosts()方法。

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

请给我提供更好的方法来做到这一点。

+0

getPosts()方法属于Post Model not Controller。如果创建一个名为Post的模型并创建getPosts模型,则可以在两个控制器中使用它。实际上,如果你有Post模型,你可以简单地使用Post :: all()而不是 –

最好创建一个特质...... How to use traits in Laravel 5.4.18?

+0

Trait用于通用功能。在这种情况下没有好处。 –

您可以通过以下方式

use App\Http\Controllers\XyzController ; 

class AnyController extends Controller { 

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

希望这将有助于使用XyzController方法中的任何控制器。

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

拥有Repository的全部意义就在于此目的。

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

这次演讲是关于控制器有点进步,但它肯定是关于控制器一个很好的做法。

我通常更喜欢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(); 
    } 
} 

我发现这个很有用,代码是可重用的。