90122


laravelで勤怠管理システムをつくっています。  
毎日24時に勤務終了と、勤務開始を自動で打刻する機能をつくるにあたって、  
スケジュールのサンプルコードを書いたのですが、プロバイダへのジョブの登録時にbindMethod()という  
コンテナにあるはずのメソッドがundefindeになってしまいます。  
「laravel実践開発」という書籍に従って作成したので、間違ってはいないはずなのですが、原因が分かりません。  
侍テラコヤという有料サービスで聞いたのですが、分からないとのことでした。  
どなたか分かる方いらっしゃれば、ご教示いただければ幸いです。

githubのURLです。  
<https://github.com/akirasasakiatgithub/attendance>

Kernel.php

[code]

    <?php
    
    namespace App\Console;
    
    use App\Jobs\automaticStamp;
    use App\Jobs\testStampJob;
    use Illuminate\Console\Scheduling\Schedule;
    use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
    use App\Model\Rest;
    use App\Models\Attendance;
    use Illuminate\Support\Facades\Auth;
    use Carbon\Carbon;
    
    
    class Kernel extends ConsoleKernel
    {
    
        protected $commands = [
            //
        ];
    
        protected function schedule(Schedule $schedule)
        {
            $id = Auth::id();
                $schedule->call(new testStampJob($id))->everyMinute();
        }
    }
    
[/code]

testStampJob.php

[code]

        <?php
    
    namespace App\Jobs;
    
    use Illuminate\Bus\Queueable;
    use Illuminate\Contracts\Queue\ShouldBeUnique;
    use Illuminate\Contracts\Queue\ShouldQueue;
    use Illuminate\Foundation\Bus\Dispatchable;
    use Illuminate\Queue\InteractsWithQueue;
    use Illuminate\Queue\SerializesModels;
    use Illuminate\Support\Facades\Auth;
    use App\Models\Rest;
    use Carbon\Carbon;
    
    class testStampJob implements ShouldQueue
    {
        use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
    
    
        public function __construct($id)
        {
            $this->id = $id;
        }
    
    
        public function __invoke()
        {
            $this->handle();
        }
        
        public function handle()
        {
            //休憩時間記録用のモデルに休憩開始時刻を打刻
            $now = Carbon::now();
            Rest::create([
                'date' => $now->format('Y-m-d'),
                'start_break' => $now->format('Y-m-d H:i:s'),
                'id_u' => $this->id,
            ]);
    
            //開始時刻に1秒加えて休憩終了時刻を打刻
            Rest::create([
                'date' => $now->addSecond()->format('Y-m-d'),
                'end_break' => $now->format('Y-m-d H:i:s'),
                'id_u' => Auth::id()
            ]);
        }
    }
    
[/code]

testStampProvider.php

[code]

        <?php
    
    namespace App\Providers;
    
    use App\Jobs\testStampJob;
    use Illuminate\Support\ServiceProvider;
    
    class testStampProvider extends ServiceProvider
    {
        public function register()
        {
            $this->app->bindMethod([testStampJob::class, 'handle'], function($job, $app) {
                return $job->handle();
            });
        }
    
[/code]


CC BY-SA 4.0
2022-07-20T02:18:12.200
90096
2022-07-21T07:56:00.923
2022-07-20T12:47:55.240
50669
50669
question
php laravel
ジョブをプロバイダーに登録しようとする際、bindMethod()がundefinedになる。


推測ですが、

  * _OK_ コマンドの実行自体は行える。実行時にエラーが発生したりはしない。
  * _NG_ エディタ上で警告が表示される。

おそらく以上の状況ですよね？だとしたら気にしなくて大丈夫です。  
_NG_ の箇所はLaravelの既知の問題で、おそらくLaravel10で修正されます。

[[10.x] Add `bindMethod` method by mahmoudmohamedramadan · Pull Request #43168
· laravel/framework](https://github.com/laravel/framework/pull/43168)

ただそれとは別の理由で、今の実装だと意図通りの動きにならない気がします。

  * スケジュールの冒頭で `Auth::id()` で対象ユーザーを拾っているがブラウザアクセスではないので「認証」自体が行われていない。そのため特に意味のない処理になっている。（登録対象は誰なのか、別の方法で特定する実装が必要）
  * Kernel でのタスク実行時はサービスコンテナを使わず自力で初期化しているのでKernelへ実装した `bindMethod()` はそもそも呼ばれていない（おそらくこの処理は不要）

難しいかもしれませんが頑張ってくださいー。


CC BY-SA 4.0
2022-07-21T07:56:00.923
90122
2022-07-21T07:56:00.923
53573
90096
answer