Php Laravel Spark、交换/交互和私有变量
使用Laravel Spark,如果我想在一个新的实现中交换Php Laravel Spark、交换/交互和私有变量,php,laravel,laravel-spark,Php,Laravel,Laravel Spark,使用Laravel Spark,如果我想在一个新的实现中交换configureTeamForNewUser,首先它看起来是可能的,因为这里有Spark::interact调用 #File: spark/src/Interactions/Auth/Register.php Spark::interact(self::class.'@configureTeamForNewUser', [$request, $user]); i、 e.框架使用Spark::interact调用configureTe
configureTeamForNewUser
,首先它看起来是可能的,因为这里有Spark::interact
调用
#File: spark/src/Interactions/Auth/Register.php
Spark::interact(self::class.'@configureTeamForNewUser', [$request, $user]);
i、 e.框架使用Spark::interact
调用configureTeamForNewUser
,这意味着我可以Spark::swap
它
但是,如果我查看configureTemForNewUser
方法本身
#File: spark/src/Interactions/Auth/Register.php
public function configureTeamForNewUser(RegisterRequest $request, $user)
{
if ($invitation = $request->invitation()) {
Spark::interact(AddTeamMember::class, [$invitation->team, $user]);
self::$team = $invitation->team;
$invitation->delete();
} elseif (Spark::onlyTeamPlans()) {
self::$team = Spark::interact(CreateTeam::class, [
$user, ['name' => $request->team, 'slug' => $request->team_slug]
]);
}
$user->currentTeam();
}
此方法为私有$team
类属性指定一个值。我的理解是,如果我使用Spark::swap
调用我的回调,而不是原始方法。初步测试证实了这一点。但是,由于我的回调无法设置$team
,这意味着我的回调将以破坏其他spark功能的方式更改系统的行为
以上是对系统的正确理解吗?或者我遗漏了什么,并且可以在另一个函数调用中交换(以某种方式调用原始的
configureTeamForNewUser
)?当然,您可以交换此configureTeamForNewUser
方法。Spark在注册时为用户创建团队。您必须在App/Providers/SparkServiceProvider.php类的Booted()
方法中添加swap方法。
在下面的顶部使用中
use Laravel\Spark\Contracts\Interactions\Auth\Register;
use Laravel\Spark\Contracts\Http\Requests\Auth\RegisterRequest;
use Laravel\Spark\Contracts\Interactions\Settings\Teams\CreateTeam;
use Laravel\Spark\Contracts\Interactions\Settings\Teams\AddTeamMember;
在我的例子中,我想将新的字段调用“custom_one”添加到teams表中。在booted()
方法中,按如下所示交换该方法
Spark::swap('Register@configureTeamForNewUser', function(RegisterRequest $request, $user){
if ($invitation = $request->invitation()) {
Spark::interact(AddTeamMember::class, [$invitation->team, $user]);
self::$team = $invitation->team;
$invitation->delete();
} elseif (Spark::onlyTeamPlans()) {
self::$team = Spark::interact(CreateTeam::class, [ $user,
[
'name' => $request->team,
'slug' => $request->team_slug,
'custom_one' => $request->custom_one,
] ]);
}
$user->currentTeam();
});
为了添加一个新的自定义字段,我必须交换TeamRepository@create
方法。交换configureTeamForNewUser
方法后,交换TeamRepository@create方法,该方法位于引导()上
然后继续注册
请参见谢谢您的关注。然而,我似乎没有正确地强调我的要求。当您的示例运行时,代码中的self::$team引用将引用提供者类变量,而不是AddTeamMember类上的静态类$team变量。这意味着当AddTeamMember中的其他方法尝试访问self::$team时,将不会设置self::$team。
Spark::swap('TeamRepository@create', function ($user, $data) {
$attributes = [
'owner_id' => $user->id,
'name' => $data['name'],
'custom_one' => $data['custom_one'],
'trial_ends_at' => Carbon::now()->addDays(Spark::teamTrialDays()),
];
if (Spark::teamsIdentifiedByPath()) {
$attributes['slug'] = $data['slug'];
}
return Spark::team()->forceCreate($attributes);
});