2017-09-15 5 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()メソッドを使用してすべての投稿を取得し、それらを表示することです。 PostsControllerのindex()メソッドの中でPostsControllerのgetPosts()メソッドを使用するにはどうすればいいですか?

片方向にPostsControllerを拡張して使用します。しかし、別のコントローラの方法も使用したい場合はどうでしょうか。

私はより良い方法を提供してください。

+0

getPosts()メソッドはコントローラではないポストモデルに属します。 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

あなたのコントローラにはロジックがありません。リポジトリにサービスを作成するか、メソッドを作成し、PostsControllerのgetPosts()のコードをこのメソッドに移動します。 PostsControllerとPageControllerの両方でこの新しいメソッドを呼び出します。

リポジトリを持つことの全ポイントは、この目的のためです。

0

私は通常、タスクを完了させるためにリポジトリパターンを使用します。

ここに概要があります。

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

このコードは有用でコードは再利用可能です。

関連する問題