tohokuaikiのチラシの裏

技術的ネタとか。

LaravelのRequest->rules()がどの条件で掛かるのか?

が良くわからなかったので追ってみた。

ざっとBreakpointを設置して

<?php
class FormRequestServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap the application services.
     *
     * @return void
     */
    public function boot()
    {
        $this->app->afterResolving(ValidatesWhenResolved::class, function ($resolved) {
            $resolved->validateResolved();
        });

の $resolved->validateResolved();で登録しているみたい。GETメソッドの場合は個々を実行せず、PATCHメソッドの時はこの部分を実行していた。

$this->app->afterResolving() の実装

このメソッドを追ってみるとsrc/Illuminate/Container/Container.php

<?php
class Container implements ArrayAccess, ContainerContract
{
    public function afterResolving($abstract, Closure $callback = null)
    {
        if (is_string($abstract)) {
            $abstract = $this->getAlias($abstract);
        }

        if ($abstract instanceof Closure && is_null($callback)) {
            $this->globalAfterResolvingCallbacks[] = $abstract;
        } else {
            $this->afterResolvingCallbacks[$abstract][] = $callback;
        }
    }

だったんだけど、こっからよくわかんなかった…