Open9

Laravel8or便利機能&パッケージ Memo

ta.toshiota.toshio

middlewareに引数渡せる

Route::get('/success-diary', ShowSuccessDiaryController::class)
        ->middleware('onboarding:SuccessDiary.Onboarding' )
        ->name('success-diary. index' )

class ShowOnboardingScreen
{
    // $viewにSuccessDiary.Onboardingが入っていると思う
    public function handle(Request $request, Closure $next, string $view)
    {
         if (! $request->user()->sawOnboardingScreen($view)) {

            $request->user()->markOnboardingScreenAsSeen($view) ;

            return Inertia::render(str_replace('.', '/', $view));
        }

        return $next($request);
    }
}

https://mobile.twitter.com/marcelpociot/status/1465297598504476678

ta.toshiota.toshio

Eloquentのモデルでは、他のリレーションの最新(または最古)の項目を取得するリレーションを定義することができます。

public function historyItems(): HasMany
{
    return $this
        ->hasMany (ApplicationHealthCheckHistoryItem::class)
        ->orderByDesc('created_at');
}


public function LatestHistoryItem(): HasOne
{
    return $this
        ->hasOne(ApplicationHealthCheckHistoryItem: : class)
        ->latestOfMany();
}

https://mobile.twitter.com/freekmurze/status/1465077177553244164

ta.toshiota.toshio

https://spatie.be/docs/laravel-health/v1/introduction

this package can be used to monitor the health of your Laravel application.

example

class HealthServiceProvider extends ServiceProvider
{
    public function register()
    {
        Health::checks([
            CpuLoadCheck::new()->failWhenLoadIsHigherInTheLast5Minutes(2.0),
            DebugModeCheck::new(),
            EnvironmentCheck::new(),
            DatabaseCheck::new(),
            HorizonCheck::new(),
            UsedDiskSpaceCheck::new()
                ->warnWhenUsedSpaceIsAbovePercentage(90)
                ->failWhenUsedSpaceIsAbovePercentage(95),
            ScheduleCheck::new()->heartbeatMaxAgeInMinutes(2),
            FlareErrorOccurrenceCountCheck::new()
                ->projectId(config('services.flare.project_id'))
                ->apiToken(config('services.flare.api_token'))
        ]);
    }
}
ta.toshiota.toshio

以下2つは同じふるまい

$query->tap(fn ($query) => match (request('sort')) {
   ‘category' => $query->orderByCategory(),
   'last_comment' => $query->orderByLastCommentDate(),
   'status' => $query->orderByStatus(),
   'activity' => $query->orderByActivity(),
   default => $query->orderByName(),
);
$query->when(Request::input('sort'), Gunction ($query, $sort) {
    Switch ($sort) 
        case 'category': return $query->orderByCategory();
        case 'last_comment': return $query->orderByLastCommentDate();
        case 'status': return $query->orderByStatus();
        case ‘activity’: return $query->orderByActivity();
    3
}, gunction ($query) {
    $query->orderByName();
});

ta.toshiota.toshio
    Carbon::macro('render', function ($format = 'M jS, Y') {
        /** @var Carbon $this */

        return new HtmlString(
            "<time datetime='{$this->format('Y-m-d')}'>{$this->format ($format)}</time>"
        );
    });

    <dt class="font-medium text-gray-800">Reported at</dt>
    <dd>{{ $issue->reported_at->render() }}</dd>