【问题标题】:Laravel using separate controller for separate logicLaravel 使用单独的控制器进行单独的逻辑
【发布时间】:2018-02-24 03:45:36
【问题描述】:

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

在这里我遇到了困难。

有两个控制器 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 并使用它。但是如果我们也想使用另一个控制器的方法呢?

请为我提供更好的方法。

【问题讨论】:

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

标签: php laravel frameworks


【解决方案1】:

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

这个演讲是关于控制器的一些进步,但它肯定是关于控制器的一个很好的实践。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • Trait 用于通用功能。在这种情况下没有任何好处。
    【解决方案3】:

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

    use App\Http\Controllers\XyzController ;
    
    class AnyController extends Controller {
    
        public function functionName()
        {
            $result = (new XyzController)->methodName();
            // this will call method of XyzController
        }
    }
    

    希望这会有所帮助。

    【讨论】:

      【解决方案4】:

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

      拥有 Repository 的全部目的就是为了这个目的。

      【讨论】:

        【解决方案5】:

        我通常更喜欢存储库模式来完成任务。

        这里有一个概述。

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

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

        【讨论】:

          猜你喜欢
          • 2012-04-16
          • 2021-02-21
          • 2023-04-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-08-06
          • 1970-01-01
          相关资源
          最近更新 更多