我是应用Laravel
的Lucid 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();
}
}
希望有意义,并将帮助您更好地理解架构。