gpt4 book ai didi

php - Laravel Lucid体系结构依赖项注入(inject)

转载 作者:搜寻专家 更新时间:2023-10-31 21:19:28 25 4
gpt4 key购买 nike

我对Lucid Architecture应用于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
class GetUsersJob extends Job {

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

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

不过,我需要将所有依赖项传递给每个作业。我认为这可以做得更好。
请提出一个更好的方法。

最佳答案

你说得对,你的代码片段绝对可以改进。
首先,让我们澄清一些概念,我也可能不是100%正确,这只是我对这个架构的理解。
工作是一个单一的原子行为,它只负责一件事。作业可以很容易地重用,它们就像应用程序的微型构建块。
功能通常包含多个作业,并为特定服务的请求提供服务。
我建议使用the Repository pattern。在您的示例中,您传递的是model类,从语义的角度来看,它有点混乱。
我分享我的课程,你可以自由使用-https://gist.github.com/CROSP/de909251feaa1c29bfd39336bc5aa4db
在您的例子中,您可以用一个方法创建一个名为BaseRepository的接口:

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 );
}

}

所以在你的作业类中,你可以只使用以下代码:
class GetUsersJob extends Job {
public function handle( UserRepositoryContract $userRepo) {
return $userRepo->all();
}
}

希望这是有意义的,并将帮助你更好地理解架构。

关于php - Laravel Lucid体系结构依赖项注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57020166/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com