Open9
Laravel8or便利機能&パッケージ Memo
// Don't do this
Post::where('category_id', $category->id)
->where('author_id', $user->id)
->first();
// Do this
Post::whereBelongsTo($category)
->whereBelongsTo($user, ‘author')
->first();
// Don't do this
$post->author_id == $user->id;
// Do this
$post->author()->is($user);
middleware内でバリデーションが可能に
namespace App\Http\Middleware;
class CheckRequiredParameters
{
public function handle(Request $request, Closure $next)
{
$rules = [
‘user_id' => 'required',
1;
$request->validate($rules);
return $next($request);
}
}
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);
}
}
もし、Eloquentがカスタムコレクションクラスを返すようにしたい場合は、モデルで newCollection
メソッドを使用します。
class Invoice extends Eloquent
{
public function newCollection(array $models = [])
{
return new InvoiceCollection($models);
}
}
Eloquentのモデルでは、他のリレーションの最新(または最古)の項目を取得するリレーションを定義することができます。
public function historyItems(): HasMany
{
return $this
->hasMany (ApplicationHealthCheckHistoryItem::class)
->orderByDesc('created_at');
}
public function LatestHistoryItem(): HasOne
{
return $this
->hasOne(ApplicationHealthCheckHistoryItem: : class)
->latestOfMany();
}
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'))
]);
}
}
以下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();
});
$request->whenFilled('name', function ($input) {
// "name"の値が空でない場合の処理…
}, function () {
// "name"の値が空の場合の処理…
});
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>