【问题标题】:Laravel Spark, Swap/Interact, and Private VariablesLaravel Spark、交换/交互和私有变量
【发布时间】:2017-06-22 01:03:58
【问题描述】:

使用 Laravel Spark,如果我想为 configureTeamForNewUser 换一个新的实现,起初看起来这是可能的,因为这里调用了 Spark::interact

#File: spark/src/Interactions/Auth/Register.php
Spark::interact(self::class.'@configureTeamForNewUser', [$request, $user]);

即框架使用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,这意味着我的回调会以一种会破坏其他火花功能的方式改变系统的行为。

以上是对系统的正确理解吗?还是我遗漏了什么,可以在另一个函数调用中swap(以某种方式调用原始configureTeamForNewUser)?

【问题讨论】:

    标签: php laravel laravel-spark


    【解决方案1】:

    当然,你可以交换这个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”添加到团队表中。在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();
    });  
    

    为了添加一个新的 custom_one 字段,我还必须交换 TeamRepository@create 方法。交换configureTeamForNewUser方法后,交换booted()里面的TeamRepository@create方法,

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

    然后继续您的注册。

    Laravel Spark documentation

    【讨论】:

    • 感谢您的关注。但是,似乎我未能正确强调我的要求。当您的示例将运行时,代码中的 self::$team 引用将引用提供程序类变量,而不是 AddTeamMember 类上的静态类 $team 变量。这意味着当 AddTeamMember 中的其他方法尝试访问 self::$team 时,将不会设置 self::$team。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-17
    • 2018-05-02
    • 2015-01-28
    • 1970-01-01
    • 2015-09-17
    • 2021-09-23
    • 2020-08-17
    相关资源
    最近更新 更多