Skip to content

Commit

Permalink
[10.x] Add Blade @session Directive (#49339)
Browse files Browse the repository at this point in the history
* Add Blade `@session` Directive

* Fix test

* Refactor to `$__sessionPrevious` array for nesting

* Unset `$__sessionPrevious` if it is set and empty.

* use value

---------

Co-authored-by: Taylor Otwell <taylor@laravel.com>
  • Loading branch information
jrd-lewis and taylorotwell authored Dec 15, 2023
1 parent c14b82a commit 31bc1bd
Show file tree
Hide file tree
Showing 3 changed files with 65 additions and 0 deletions.
1 change: 1 addition & 0 deletions src/Illuminate/View/Compilers/BladeCompiler.php
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ class BladeCompiler extends Compiler implements CompilerInterface
Concerns\CompilesLayouts,
Concerns\CompilesLoops,
Concerns\CompilesRawPhp,
Concerns\CompilesSessions,
Concerns\CompilesStacks,
Concerns\CompilesStyles,
Concerns\CompilesTranslations,
Expand Down
37 changes: 37 additions & 0 deletions src/Illuminate/View/Compilers/Concerns/CompilesSessions.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
<?php

namespace Illuminate\View\Compilers\Concerns;

trait CompilesSessions
{
/**
* Compile the session statements into valid PHP.
*
* @param string $expression
* @return string
*/
protected function compileSession($expression)
{
$expression = $this->stripParentheses($expression);

return '<?php $__sessionArgs = ['.$expression.'];
if (session()->has($__sessionArgs[0])) :
if (isset($value)) { $__sessionPrevious[] = $value; }
$value = session()->get($__sessionArgs[0]); ?>';
}

/**
* Compile the endsession statements into valid PHP.
*
* @param string $expression
* @return string
*/
protected function compileEndsession($expression)
{
return '<?php unset($value);
if (isset($__sessionPrevious) && !empty($__sessionPrevious)) { $value = array_pop($__sessionPrevious); }
if (isset($__sessionPrevious) && empty($__sessionPrevious)) { unset($__sessionPrevious); }
endif;
unset($__sessionArgs); ?>';
}
}
27 changes: 27 additions & 0 deletions tests/View/Blade/BladeSessionTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<?php

namespace Illuminate\Tests\View\Blade;

class BladeSessionTest extends AbstractBladeTestCase
{
public function testSessionsAreCompiled()
{
$string = '
@session(\'status\')
<span>{{ $value }}</span>
@endsession';
$expected = '
<?php $__sessionArgs = [\'status\'];
if (session()->has($__sessionArgs[0])) :
if (isset($value)) { $__sessionPrevious[] = $value; }
$value = session()->get($__sessionArgs[0]); ?>
<span><?php echo e($value); ?></span>
<?php unset($value);
if (isset($__sessionPrevious) && !empty($__sessionPrevious)) { $value = array_pop($__sessionPrevious); }
if (isset($__sessionPrevious) && empty($__sessionPrevious)) { unset($__sessionPrevious); }
endif;
unset($__sessionArgs); ?>';

$this->assertEquals($expected, $this->compiler->compileString($string));
}
}

0 comments on commit 31bc1bd

Please sign in to comment.