中间件类可以用作服务层吗?

时间:2016-12-15 13:33:27

标签: java php laravel model-view-controller service

在大多数Java情况下,存在两个类:一个负责应用我的业务规则 - 服务层 - 另一个负责与我的数据库交互--Dao / Repository层。但是,在PHP情况下,我只有一个代表模型层的类。我的问题是,假设Laravel框架,我应该将我的业务规则放在一个独特的模型类中,还是有另一种类似于JSF的方法?我可以将中间件类用作服务层吗?

1 个答案:

答案 0 :(得分:3)

老实说,您也可以在PHP中使用服务/回购图层。

所以会发生什么

  1. Controller将输入传递给服务,服务决定要执行的操作。
  2. 然后,服务层调用repo以在必要时从数据库接收条目并执行所有业务逻辑。
  3. Repo调用模型并返回模型中的数据。
  4. 模型仅保留模型特定数据(如关系,附加属性,强制转换数组等等)
  5. 要遵循这种方法,可以这样做。

    控制器

    use App\Services\PostService;
    
    class PostController
    {
      public function __construct()
      {
        $this->postService = new PostService;
      }
    
      public function show($id)
      {
        $viewData = $this->postService->getPostData($id);
    
        return view('posts.show', $viewData);
      }
    }
    

    服务层

    use App\Repositories\PostRepository;
    use App\Repositories\CommentRepository;
    
    class PostService
    {
      public function __construct()
      {
        $this->postRepo = new PostRepository;
    
        $this->commentRepo = new CommentRepository;
      }
    
      public function getPostData($id)
      {
        $post = $this->postRepo->get($id);
    
        $recentComments = $this->commentsRepo->getRecentComments();
    
        return collect(compact('post', 'recentComments'));
      }
    }
    

    存储库层

    use App\Models\Post;
    
    public function PostRepository
    {
      public function get()
      {
        return Post::findOrFail($id);
      }
    }
    

    此外,对于您的上一个问题,我想说,中间件仅用作必备条件。换句话说,假设您要确保用户登录以查看该特定路由,然后您将应用auth中间件并保护您的路由免受其他未登录的用户...据我说,使用服务层作为中间件并不是真正需要的。您显然可以通过$this->myService = new Service在中间件中调用服务层,但将其作为中间件并不是一个好的做法。

    希望我能够很好地回答你的问题:)