この回答は主に、元の質問を少し加えて、現在のソリューションを検討することに基づいています。
のようなメソッドでモデルを埋め尽くすよりもcreateNew
、特にモデルと対話するためのタイプのクラスを作成すると、管理が容易になるでしょう。これをリポジトリ、サービス、または好きなように呼び出すことができますが、サービスで実行します。
// app/Services/UserService.php
<?php namespace App\Services;
use App\Models\User; // or wherever your User model is
class UserService {
public function __construct( User $user ) {
$this->user = $user;
}
public function create( array $attributes, $role = null ) {
$user = $this->user->create( $attributes );
if ( $role ) {
$user->attachRole( $role );
}
return $user;
}
}
ここで、パスワードのハッシュが失われたという事実に対処する必要があります。
// app/Models/User.php
class User ... {
public function setPasswordAttribute( $password ) {
$this->attributes[ 'password' ] = bcrypt( $password );
}
}
そして今、アクティベーションメールを送信するという問題があります - これはイベントできれいに解決できます. ターミナルでこれを実行します。
php artisan make:event UserHasRegistered
次のようになります。
// app/Events/UserHasRegistered.php
<?php namespace App\Events;
use App\Models\User;
use Illuminate\Queue\SerializesModels;
class UserHasRegistered extends Event {
use SerializesModels;
public $user;
public function __construct( User $user ) {
$this->user = $user;
}
}
次に、イベントのリスナーが必要です。
php artisan make:listener SendUserWelcomeEmail
そして、これは好きなだけ複雑にすることができます。これは、私が横たわっているプロジェクトからコピー/貼り付けしたものです。
// app/Listeners/SendUserWelcomeEmail.php
<?php namespace App\Listeners;
use App\Events\UserHasRegistered;
use App\Services\NotificationService;
class SendUserWelcomeEmail {
protected $notificationService;
public function __construct( NotificationService $notificationService ) {
$this->notify = $notificationService;
}
public function handle( UserHasRegistered $event ) {
$this->notify
->byEmail( $event->user->email, 'Welcome to the site', 'welcome-user' )
->send();
}
}
あとは、作成したばかりのイベントとリスナーが関連していることを Laravel に伝え、イベントを発生させるだけです。
// app/Providers/EventServiceProvider.php
use App\Events\UserHasRegistered;
use App\Listeners\SendUserWelcomeEmail;
class EventServiceProvider extends ServiceProvider {
// find this array near the top, and add this in
protected $listen = [
UserHasRegistered::class => [
SendUserWelcomeEmail::class,
],
];
// ...
}
あとはイベントを発生させるだけです。モデル オブザーバーに関する私の別の記事を参照してください。まず、インポートEvent
してからApp\Events\UserHasRegistered
、created
メソッドで を呼び出す必要がありますEvent::fire( new UserHasRegistered( $user ) )
。