💩

LaravelでSentryのシリアライザをカスタマイズする

2022/03/07に公開

本記事でやること

PHP SDK for Sentryでは関数の実引数なども報告してくれるが、LaravelのCollectionなどは
Object Illuminate\Support\Collection のように報告されて手がかりゼロになってしまう:

このように改善する

公式doc

https://docs.sentry.io/platforms/php/guides/laravel/usage/#decorating-the-client-builder

コード例

MyRepresentationSerializer.php

use Illuminate\Support\Collection;
use Sentry\Serializer\RepresentationSerializer;

class MyRepresentationSerializer extends RepresentationSerializer
{
    public function representationSerialize($value)
    {
        if ($value instanceof Collection) {
            return var_export($value, true);
        }

        return parent::representationSerialize($value);
    }
}

今回は雑に継承しましたが真面目にやるならComposite組むなどしたほうがいいと思います

AppServiceProvider.php

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        // ...
        $this->app->extend(
            ClientBuilderInterface::class,
            function (ClientBuilderInterface $clientBuilder): ClientBuilderInterface {
                $clientBuilder->setRepresentationSerializer(new MyRepresentationSerializer($clientBuilder->getOptions()));
                return $clientBuilder;
            }
        );
	// ...
    }

2022/3/11追記

var_export は循環参照があると死ぬので Symfony の VarDumper 等を使ったほうが良いですね

https://symfony.com/doc/current/components/var_dumper/advanced.html#dumpers

Discussion