2017-09-15 81 views
0

我認爲我們有單獨的控制器分別爲我們的應用程序單獨的邏輯或模塊,我也發現在另一個控制器內使用控制器不是一個好習慣。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()而不是 –

回答

0

您可以通過以下方式

use App\Http\Controllers\XyzController ; 

class AnyController extends Controller { 

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

希望這將有助於使用XyzController方法中的任何控制器。

0

您的控制器不應該有任何邏輯。在Repository中創建一個服務或創建一個方法,並將PostsController的getPosts()的代碼移動到此方法中。然後在PostsController和PageController中調用這個新方法。

擁有Repository的全部意義就在於此目的。

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

我發現這個很有用,代碼是可重用的。

相關問題