Laravel Lucid体系结构依赖项注入

时间:2019-07-13 14:45:02

标签: php laravel laravel-5 dependency-injection lucid

我是Lucid Architecture的{​​{1}}的新用户。

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

Laravel

还有我的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

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

请提出一个更好的方法。

1 个答案:

答案 0 :(得分:1)

您是对的,您的代码片段肯定可以得到改善。 首先,让我们澄清一些概念,我可能也不是100%正确,这只是我对这种体系结构的理解。

工作是单个原子动作,应该仅负责一件事。作业可以轻松地重用,就像您的应用程序的小组成部分。

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

我建议使用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();
 }
}

希望如此,它将帮助您更好地理解体系结构。