I have to place some PHP code inside a Laravel 5 blade template. Like below
@foreach ($farmer->tasks as $task)
@if ($task->pivot->due_at) < da
According to documentation, in Laravel 5.2 and newer you can use the following code:
@php
{{-- PHP code here --}}
@endphp
Alternatively, you can extend the Blade templating engine as it's described here.
If neither of the above solutions is suitable, you are stuck with the answers given by Armen and by Gonzalo.
In modern Laravel (6/7) you should do this:
@php
yourphpcode();
@endphp
Laravel recipes suggest a simple, but effective, way to do it without including the PHP tags:
{{--*/ $var = 'test' /*--}}
{{-- --}} works as a blade comment / and / reverts the effect of comment resulting on
<?php $var = 'test' ?>
The problem is that is longer than including PHP tags :-(
The following new NewBladeCompiler will use @{ }}
for accepting all PHP code like variable assigning, class declaration, etc.
E.g. @{ $variable = 0; }}
will be compiled to <?php $variable=0; ?>
<?php
use Illuminate\View\Compilers\BladeCompiler;
class NewBladeCompiler extends BladeCompiler
{
/**
* Get the echo methods in the proper order for compilation.
*
* @return array
*/
function getEchoMethods()
{
$methods = [
'compileRawEchos' => strlen(stripcslashes($this->rawTags[0])),
'compileEscapedEchos' => strlen(stripcslashes($this->escapedTags[0])),
'compileRegularEchos' => strlen(stripcslashes($this->contentTags[0])),
'compilePhpEchos' => strlen(stripcslashes("@{"))
];
uksort($methods, function ($method1, $method2) use ($methods) {
// Ensure the longest tags are processed first
if($methods[$method1] > $methods[$method2])
{
return -1;
}
if($methods[$method1] < $methods[$method2])
{
return 1;
}
// Otherwise give preference to raw tags (assuming they've overridden)
if($method1 === 'compilePhpEchos')
{
return -1;
}
if($method2 === 'compilePhpEchos')
{
return 1;
}
if($method1 === 'compileRawEchos')
{
return -1;
}
if($method2 === 'compileRawEchos')
{
return 1;
}
if($method1 === 'compileEscapedEchos')
{
return -1;
}
if($method2 === 'compileEscapedEchos')
{
return 1;
}
});
return $methods;
}
function compilePhpEchos( $value )
{
$pattern = sprintf('/(@)?%s\s*(.+?)\s*%s(\r?\n)?/s', "@{", "}}");
$callback = function ($matches) {
$whitespace = empty($matches[3]) ? '' : $matches[3] . $matches[3];
return $matches[1] ? substr($matches[0], 1) : '<?php ' . $matches[2] . ' ?>' . $whitespace;
};
return preg_replace_callback($pattern, $callback, $value);
}
}
?>
Just open and close PHP tags:
<?php $style = '...'; ?>