ショコラ
laravel bladeでloopするには
bladeのループまとめ
もっさん先輩
①for文
@for ({初期化}; {条件}; {後処理})
@endfor
②foreach 文
@foreach ({配列} as {変数})
@endforeach
③forelse 文
@forelse ({配列}as {変数})
@empty
配列が空の時に @empty の処理が呼び出される。
@endforelse
④while 文
@while ({条件})
@endwhile
⑤break 文
@break
⑥continue 文
@continue
⑦$loop変数
$loop変数は、@foreach、@forelseで使えます。@for、@while では使えません。
現在のインデックス(0から)
$loop->index
現在のインデックス(1から)
$loop->iteration
ループの残りの数
$loop->remaining
ループのカウント数
$loop->count
ループの最初に true を返します。
$loop->first
ループの最後に true を返します。
$loop->last
現在のネストの数
$loop->depth
ネストしている場合の親の $loop変数。
$loop->parent
⑧私は AppServiceProvider.php に foreach を拡張した for_extract を宣言します。
public function boot()
{
Blade::directive('for_extract',fn($var) => "<?php \$__LOCALS ??= []; \$__LOCALS[\$loop->depth ?? 0] = get_defined_vars(); \$__currentLoopData = array($var)[0]; \$__env->addLoop(\$__currentLoopData); foreach(\$__currentLoopData as \$__): \$__env->incrementLoopIndices(); \$loop = \$__env->getLastLoop(); extract(\$__,isset(array($var)[1])?EXTR_PREFIX_ALL:EXTR_OVERWRITE,array($var)[1] ?? ''); ?>");
Blade::directive('endfor_extract',fn() => "<?php endforeach; \$__env->popLoop(); \$loop = \$__env->getLastLoop(); extract(\$__LOCALS[\$loop->depth ?? 0]); ?>");
}
因みに、現在の app/Providers/AppServiceProvider.php です。
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Blade;
class AppServiceProvider extends ServiceProvider
{
/**
* Register any application services.
*
* @return void
*/
public function register()
{
//
}
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
Blade::directive('exists' ,fn($var) => "<?php if (isset($var) && !in_array($var,[null,false,0,'',[]],true)): ?>");
Blade::directive('set' ,fn($var) => "<?php $var ?>");
Blade::directive('unset' ,fn($var) => "<?php unset($var) ?>");
Blade::directive('extract' ,fn($var) => "<?php extract($var) ?>");
Blade::directive('for_extract',fn($var) => "<?php \$__LOCALS ??= []; \$__LOCALS[\$loop->depth ?? 0] = get_defined_vars(); \$__currentLoopData = array($var)[0]; \$__env->addLoop(\$__currentLoopData); foreach(\$__currentLoopData as \$__): \$__env->incrementLoopIndices(); \$loop = \$__env->getLastLoop(); extract(\$__,isset(array($var)[1])?EXTR_PREFIX_ALL:EXTR_OVERWRITE,array($var)[1] ?? ''); ?>");
Blade::directive('endfor_extract',fn() => "<?php endforeach; \$__env->popLoop(); \$loop = \$__env->getLastLoop(); extract(\$__LOCALS[\$loop->depth ?? 0]); ?>");
Blade::directive('div' ,fn($times) => "<?php \$times = $times; if (0 == \$loop->index % $times): ?>");
Blade::directive('div_close' ,fn() => "<?php if (((0 != \$loop->index) && (0 == (\$loop->index + 1) % \$times)) || \$loop->last): ?>");
Blade::directive('enddiv' ,fn() => "<?php endif ?>");
Blade::directive('checked' ,fn($var) => "<?php if ($var) echo 'checked' ?>");
Blade::directive('selected' ,fn($var) => "<?php if ($var) echo 'selected' ?>");
Blade::directive('last' ,fn($var) => "<?php if (\$loop->last) echo $var ?>");
Blade::directive('script' ,fn() => "<?php \$__env->startPush('scripts') ?>");
Blade::directive('endscript' ,fn() => "<?php \$__env->stopPush() ?>");
Blade::directive('dialog' ,fn() => "<?php \$__env->startPush('dialogs') ?>");
Blade::directive('enddialog' ,fn() => "<?php \$__env->stopPush() ?>");
Blade::directive('parent' ,fn() => "window.livewire.all().find(i => -1 != i.__instance.childIds.indexOf('{{ \$_instance->id }}'))");
Blade::directive('config' ,fn($var) => "<?= _config($var) ?>");
Blade::directive('url' ,fn($var) => "<?= _url($var) ?>");
Blade::directive('action' ,fn() => "<?= _url(\Route::currentRouteName()) ?>");
Blade::directive('hidden' ,fn($vars) => "<?php foreach ([$vars] as \$var): ?><input type=\"hidden\" name=\"{{ \$var }}\" value=\"{{ \$\$var }}\"><?php endforeach ?>");
}
}
foreach ($articles as $article) で $article[”title] と書かなくても OK です。
@for_extract ($articles)
{{ $tilte }}
@endfor_extract
ローカル変数にプレフィックスを付ける場合は、第2パラメータに設定します。
@for_extract ($articles,'article')
{{ $article_tilte }}
@endfor_extract
以上