我是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
但是,我需要将所有依赖项传递给每个作业。我认为这可以做得更好。
请提出一个更好的方法。
答案 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();
}
}
希望如此,它将帮助您更好地理解体系结构。