たぶん週刊「今週の進捗」

1週間に勉強したことや実装したことをネタに、週に1回(主に土日に)更新していく予定です。「多分」なので、臨時休刊があってもご海容ください。

Laravel デバッグメモ

Laravel の勉強をしていたら、いくつか解消に手こずるバグがあったので、解決方法をメモ。

Session is missing expected key [errors].

テストを実行したら以下のようなエラーが出た。

テスト

public function test_status_should_be_within_defined_numbers()
{
    $this->seed('TasksTableSeeder');
    $response = $this->post('/folders/1/tasks/1/edit', [
        'title'    => 'Sample task',
        'due_date' => Carbon::today()->format('Y/m/d'),
        'status'   => 999,
    ]);
    $response->assertSessionHasErrors([
        'status' => '状態 には 未着手、着手中、完了 のいずれかを指定してくださ>い。',
    ]);
}

結果

Feature\Task
 ? Status should be within defined numbers
   x
   x Session is missing expected key [errors].
   x Failed asserting that false is true.
   x
   x /home/vagrant/code/sample/vendor/laravel/framework/src/Illuminate/Foundation/Testing/TestResponse.php:850
   x /home/vagrant/code/sample/vendor/laravel/framework/src/Illuminate/Foundation/Testing/TestResponse.php:888
   x /home/vagrant/code/sample/tests/Feature/TaskTest.php:85
   x

エラーメッセージを見ても原因がわからない…
いろいろとぐぐってみたら、以下の記事が参考になりそうでした。

public-constructor.com

対象のテストに $this->withoutExceptionHandling(); を挿入すると、エラーメッセージが見やすくなる、かも…思ってやってみたら、
エラーの一番大きな原因は作った FormRequest クラスのサブクラスを Controller で use していないことでした。

ErrorException thrown with message "Undefined offset: 1"

RegisterController でユーザ登録ページを作成して、
ブラウザから showRegisterForm にルーティングされているアドレスにアクセスしたら、エラー画面が出た。

ErrorException thrown with message "Undefined offset: 1"
Stacktrace:
#65 ErrorException in /home/vagrant/code/sample/vendor/laravel/framework/src/Illuminate/View/Compilers/Concerns/CompilesLoops.php:95
#64 Illuminate\Foundation\Bootstrap\HandleExceptions:handleError in /home/vagrant/code/sample/vendor/laravel/framework/src/Illuminate/View/Compilers/Concerns/CompilesLoops.php:95
#63 Illuminate\View\Compilers\BladeCompiler:compileForeach in /home/vagrant/code/sample/vendor/laravel/framework/src/Illuminate/View/Compilers/BladeCompiler.php:329
#62 Illuminate\View\Compilers\BladeCompiler:compileStatement in /home/vagrant/code/sample/vendor/laravel/framework/src/Illuminate/View/Compilers/BladeCompiler.php:311
#61 Illuminate\View\Compilers\BladeCompiler:Illuminate\View\Compilers\{closure} in [internal]:0
#60 preg_replace_callback in /home/vagrant/code/sample/vendor/laravel/framework/src/Illuminate/View/Compilers/BladeCompiler.php:312
#59 Illuminate\View\Compilers\BladeCompiler:compileStatements in /home/vagrant/code/sample/vendor/laravel/framework/src/Illuminate/View/Compilers/BladeCompiler.php:279
#58 Illuminate\View\Compilers\BladeCompiler:parseToken in /home/vagrant/code/sample/vendor/laravel/framework/src/Illuminate/View/Compilers/BladeCompiler.php:171
#57 Illuminate\View\Compilers\BladeCompiler:compileString in /home/vagrant/code/sample/vendor/laravel/framework/src/Illuminate/View/Compilers/BladeCompiler.php:120
#56 Illuminate\View\Compilers\BladeCompiler:compile in /home/vagrant/code/sample/vendor/laravel/framework/src/Illuminate/View/Engines/CompilerEngine.php:51
#55 Illuminate\View\Engines\CompilerEngine:get in /home/vagrant/code/sample/vendor/laravel/framework/src/Illuminate/View/View.php:142
#54 Illuminate\View\View:getContents in /home/vagrant/code/sample/vendor/laravel/framework/src/Illuminate/View/View.php:125
#53 Illuminate\View\View:renderContents in /home/vagrant/code/sample/vendor/laravel/framework/src/Illuminate/View/View.php:90
#52 Illuminate\View\View:render in /home/vagrant/code/sample/vendor/laravel/framework/src/Illuminate/Http/Response.php:42
#51 Illuminate\Http\Response:setContent in /home/vagrant/code/sample/vendor/symfony/http-foundation/Response.php:205
#50 Symfony\Component\HttpFoundation\Response:__construct in /home/vagrant/code/sample/vendor/laravel/framework/src/Illuminate/Routing/Router.php:750
#49 Illuminate\Routing\Router:toResponse in /home/vagrant/code/sample/vendor/laravel/framework/src/Illuminate/Routing/Router.php:722
#48 Illuminate\Routing\Router:prepareResponse in /home/vagrant/code/sample/vendor/laravel/framework/src/Illuminate/Routing/Router.php:682
#47 Illuminate\Routing\Router:Illuminate\Routing\{closure} in /home/vagrant/code/sample/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php:30
#46 Illuminate\Routing\Pipeline:Illuminate\Routing\{closure} in /home/vagrant/code/sample/app/Http/Middleware/RedirectIfAuthenticated.php:24
#45 App\Http\Middleware\RedirectIfAuthenticated:handle in /home/vagrant/code/sample/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:163
#44 Illuminate\Pipeline\Pipeline:Illuminate\Pipeline\{closure} in /home/vagrant/code/sample/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php:53
#43 Illuminate\Routing\Pipeline:Illuminate\Routing\{closure} in /home/vagrant/code/sample/vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php:41
#42 Illuminate\Routing\Middleware\SubstituteBindings:handle in /home/vagrant/code/sample/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:163
#41 Illuminate\Pipeline\Pipeline:Illuminate\Pipeline\{closure} in /home/vagrant/code/sample/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php:53
#40 Illuminate\Routing\Pipeline:Illuminate\Routing\{closure} in /home/vagrant/code/sample/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php:75
#39 Illuminate\Foundation\Http\Middleware\VerifyCsrfToken:handle in /home/vagrant/code/sample/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:163
#38 Illuminate\Pipeline\Pipeline:Illuminate\Pipeline\{closure} in /home/vagrant/code/sample/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php:53
#37 Illuminate\Routing\Pipeline:Illuminate\Routing\{closure} in /home/vagrant/code/sample/vendor/laravel/framework/src/Illuminate/View/Middleware/ShareErrorsFromSession.php:49
#36 Illuminate\View\Middleware\ShareErrorsFromSession:handle in /home/vagrant/code/sample/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:163
#35 Illuminate\Pipeline\Pipeline:Illuminate\Pipeline\{closure} in /home/vagrant/code/sample/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php:53
#34 Illuminate\Routing\Pipeline:Illuminate\Routing\{closure} in /home/vagrant/code/sample/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php:63
#33 Illuminate\Session\Middleware\StartSession:handle in /home/vagrant/code/sample/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:163
#32 Illuminate\Pipeline\Pipeline:Illuminate\Pipeline\{closure} in /home/vagrant/code/sample/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php:53
#31 Illuminate\Routing\Pipeline:Illuminate\Routing\{closure} in /home/vagrant/code/sample/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/AddQueuedCookiesToResponse.php:37
#30 Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse:handle in /home/vagrant/code/sample/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:163
#29 Illuminate\Pipeline\Pipeline:Illuminate\Pipeline\{closure} in /home/vagrant/code/sample/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php:53
#28 Illuminate\Routing\Pipeline:Illuminate\Routing\{closure} in /home/vagrant/code/sample/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/EncryptCookies.php:66
#27 Illuminate\Cookie\Middleware\EncryptCookies:handle in /home/vagrant/code/sample/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:163
#26 Illuminate\Pipeline\Pipeline:Illuminate\Pipeline\{closure} in /home/vagrant/code/sample/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php:53
#25 Illuminate\Routing\Pipeline:Illuminate\Routing\{closure} in /home/vagrant/code/sample/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:104
#24 Illuminate\Pipeline\Pipeline:then in /home/vagrant/code/sample/vendor/laravel/framework/src/Illuminate/Routing/Router.php:684
#23 Illuminate\Routing\Router:runRouteWithinStack in /home/vagrant/code/sample/vendor/laravel/framework/src/Illuminate/Routing/Router.php:659
#22 Illuminate\Routing\Router:runRoute in /home/vagrant/code/sample/vendor/laravel/framework/src/Illuminate/Routing/Router.php:625
#21 Illuminate\Routing\Router:dispatchToRoute in /home/vagrant/code/sample/vendor/laravel/framework/src/Illuminate/Routing/Router.php:614
#20 Illuminate\Routing\Router:dispatch in /home/vagrant/code/sample/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php:176
#19 Illuminate\Foundation\Http\Kernel:Illuminate\Foundation\Http\{closure} in /home/vagrant/code/sample/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php:30
#18 Illuminate\Routing\Pipeline:Illuminate\Routing\{closure} in /home/vagrant/code/sample/vendor/fideloper/proxy/src/TrustProxies.php:57
#17 Fideloper\Proxy\TrustProxies:handle in /home/vagrant/code/sample/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:163
#16 Illuminate\Pipeline\Pipeline:Illuminate\Pipeline\{closure} in /home/vagrant/code/sample/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php:53
#15 Illuminate\Routing\Pipeline:Illuminate\Routing\{closure} in /home/vagrant/code/sample/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php:31
#14 Illuminate\Foundation\Http\Middleware\TransformsRequest:handle in /home/vagrant/code/sample/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:163
#13 Illuminate\Pipeline\Pipeline:Illuminate\Pipeline\{closure} in /home/vagrant/code/sample/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php:53
#12 Illuminate\Routing\Pipeline:Illuminate\Routing\{closure} in /home/vagrant/code/sample/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php:31
#11 Illuminate\Foundation\Http\Middleware\TransformsRequest:handle in /home/vagrant/code/sample/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:163
#10 Illuminate\Pipeline\Pipeline:Illuminate\Pipeline\{closure} in /home/vagrant/code/sample/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php:53
#9 Illuminate\Routing\Pipeline:Illuminate\Routing\{closure} in /home/vagrant/code/sample/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php:27
#8 Illuminate\Foundation\Http\Middleware\ValidatePostSize:handle in /home/vagrant/code/sample/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:163
#7 Illuminate\Pipeline\Pipeline:Illuminate\Pipeline\{closure} in /home/vagrant/code/sample/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php:53
#6 Illuminate\Routing\Pipeline:Illuminate\Routing\{closure} in /home/vagrant/code/sample/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/CheckForMaintenanceMode.php:62
#5 Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode:handle in /home/vagrant/code/sample/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:163
#4 Illuminate\Pipeline\Pipeline:Illuminate\Pipeline\{closure} in /home/vagrant/code/sample/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php:53
#3 Illuminate\Routing\Pipeline:Illuminate\Routing\{closure} in /home/vagrant/code/sample/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:104
#2 Illuminate\Pipeline\Pipeline:then in /home/vagrant/code/sample/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php:151
#1 Illuminate\Foundation\Http\Kernel:sendRequestThroughRouter in /home/vagrant/code/sample/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php:116
#0 Illuminate\Foundation\Http\Kernel:handle in /home/vagrant/code/sample/public/index.php:55

どれも自分が触ってないファイルだから原因がわからない…

本来描画されるであろうテンプレート auth/register.blade.php を見てみたら、
foreach 文を @foreach($errors->all(() as $message)typo していた。

ここを修正しておしまい。

メモ

他、役立ちそうなデバッグ方法

https://teratail.com/questions/200689