laravel bladeでloopするには

ショコラ
ショコラ

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

以上

Scroll to Top