2017-06-22 37 views
0

使用Laravel星火,如果我想在爲configureTeamForNewUser一個新的實現交換,起初看起來它是可能的,因爲Spark::interact通話這裏Laravel星火,交換/交互,以及私有變量

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

即框架調用configureTeamForNewUser使用Spark::interact,這意味着我可以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)?

回答

-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('[email protected]', 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場,我不得不調換[email protected]方法爲好。交換configureTeamForNewUser方法後,交換TeamRepository @創建方法越位的啓動(),

Spark::swap('[email protected]', 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

+0

感謝您的關注。但是,我似乎沒有正確地強調我所問的。當您的示例運行時,代碼中的self :: $團隊引用將引用提供程序類變量,而不引用AddTeamMember類中的靜態類$ team變量。這意味着當AddTeamMember中的其他方法嘗試訪問self :: $ team,self :: $團隊不會被設置。 –