El @php de una linea que se traga tu vista de Blade
Agregue una linea y el error salio cuarenta lineas mas abajo, en codigo que no toque. El compilado de la vista lo explico en diez segundos.
Agregué un bloque a una vista Blade y la página tronó con un error que no tenía nada que ver con lo que escribí:
Undefined variable $visibles
$visibles se asigna cuarenta líneas más abajo, en un bloque que llevaba semanas funcionando y que yo no había tocado.
Lo que agregué
Una línea, la forma corta de asignar una variable en Blade:
@php($acceso = $proyecto['acceso'])
Y más abajo, lo que ya existía:
@php
$visibles = $detalles->take($tope);
$ocultos = $detalles->slice($tope);
@endphp
<ul>
@foreach ($visibles as $detalle)
...
@endforeach
</ul>
Mirar el compilado lo resuelve en diez segundos
Cuando un error de Blade no tiene sentido, la vista compilada dice la verdad. Están en storage/framework/views/. Ahí se veía esto:
<?php($acceso = $proyecto['acceso'])
<div class="proyecto__acceso">
...
</div>
@endif
@if (! empty($proyecto['detalles']))
@php
$visibles = ...
?>
Dos cosas saltan. Mi @php( se convirtió en un <?php de apertura sin cerrar. Y a partir de ahí los @if y @endif quedaron como texto crudo, sin compilar.
La causa
Blade, antes de compilar directivas, extrae los bloques @php ... @endphp con una expresión regular perezosa: busca desde un @php hasta el primer @endphp que encuentre después.
Mi @php( de una línea no tiene @endphp propio. La expresión lo tomó como apertura y se fue a buscar el cierre… y encontró el del bloque de cuarenta líneas más abajo. Todo lo que había en medio —mi HTML, mis @if, mis {{ }}— quedó dentro de un bloque PHP crudo.
De ahí el mensaje: el bloque de abajo nunca se ejecutó como bloque, así que $visibles jamás se asignó. El error apuntaba a la víctima, no al culpable.
El arreglo
Quité la variable y leí el arreglo directo donde lo necesitaba:
<dd>{{ $proyecto['acceso']['usuario'] }}</dd>
Tres usos, tres accesos. Menos elegante y sin la trampa.
La regla práctica
En un archivo que ya tenga un bloque @php ... @endphp, no metas un @php(...) de una línea antes de él.
Al revés sí funciona —por eso los dos @php(...) que tenía después del bloque nunca dieron problema, y por eso tardé en sospechar de la forma corta: ya la estaba usando en ese mismo archivo, sin incidentes.
Si necesitas la variable, dos salidas limpias: usa la forma de bloque también para ella, o calcúlala en el controlador, que suele ser mejor idea de todas formas.
Lo transferible
Cuando un error de plantilla señala una línea que no tocaste, no depures esa línea. Abre el compilado. Blade es un preprocesador de texto, y los preprocesadores fallan de formas que el código fuente no deja ver.