Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/241.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel Spark、交换/交互和私有变量_Php_Laravel_Laravel Spark - Fatal编程技术网

Php 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

使用Laravel Spark,如果我想在一个新的实现中交换
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);
        });