我是应用LaravelLucid Architecture新手。

我试图找到将依赖项注入我的功能的最佳方法。这是我用户的页面功能:

class UsersPageFeature extends Feature {

    public function handle( Request $request,User $user ) {
        $data = [];
        $users = $this->run( GetUsersJob::class,['userModel'=> $user );
        $data['users'] = $users;
        return $this->run( new RespondWithViewJob( "web::pages.users.page",  $data) );
    }
}

而我的GetUsersJob

class GetUsersJob extends Job {

    public function __construct($user) {
        $this->user = $user;
    }

    public function handle( ) {
        return $user->all();
    }
}

但它工作正常,我需要将所有依赖项传递给每个作业。我认为这可以做得更好。

请建议一个更好的方法。

分析解答

你是对的,你的代码片段肯定可以改进。 首先,让我们澄清一些概念,我也可能不是100%正确,这只是我对这种架构的理解。

Job是一个单一的原子动作,应该只负责一件事。可以轻松地重用作业,它们就像是应用程序的微小构建块。

功能通常包含多个作业,并为特定服务提供请求。

我建议使用the Repository pattern。在您的示例中,您正在传递模型类,从语义的角度来看,它有点令人困惑。

我分享我的BaseRepository课程,你可以自由使用它 - https://gist.github.com/CROSP/de909251feaa1c29bfd39336bc5aa4db

在您的情况下,您可以使用单个方法创建名为UserRepositoryContract的接口:

interface UserRepositoryContract extends BaseRepository {
 function getAllUsers();
}

并像扩展基础存储库类和实现合同那样实现它:

class UsersRepository extends Repository implements UserRepositoryContract {

 public function __construct( User $model ) {
  parent::__construct( $model );
 }

 function getAllUsers() {
  return $this->all();
 }
}

下一点是您可以直接在作业类中注入依赖项,当然,如果它们先前已在DI容器中注册(使用服务提供程序):

class DataRepositoriesProvider extends ServiceProvider {

 public function register() {
  $this->app->singleton( UserRepositoryContract::class, UsersRepository::class );
 }

}

所以在你的Job类中,你可以拥有以下代码:

class GetUsersJob extends Job {
 public function handle( UserRepositoryContract $userRepo) {
  return $userRepo->all();
 }
}

希望有意义,并将帮助您更好地理解架构。