How to Set Variables in a Laravel Blade Template

PhpLaravelLaravel Blade

Php Problem Overview


I'm reading the Laravel Blade documentation and I can't figure out how to assign variables inside a template for use later. I can't do {{ $old_section = "whatever" }} because that will echo "whatever" and I don't want that.

I understand that I can do <?php $old_section = "whatever"; ?>, but that's not elegant.

Is there a better, elegant way to do that in a Blade template?

Php Solutions


Solution 1 - Php

LARAVEL 5.5 AND UP

Use the full form of the blade directive:

@php
$i = 1
@endphp

LARAVEL 5.2 - 5.4

You can use the inline tags:

@php ($i = 1)

Or you can use it in a block statement:

@php
$i = 1
@endphp

ADD A 'DEFINE' TAG

If you want to use custom tags and use a @define instead of @php, extend Blade like this:

/*
|--------------------------------------------------------------------------
| Extend blade so we can define a variable
| <code>
| @define $variable = "whatever"
| </code>
|--------------------------------------------------------------------------
*/

\Blade::extend(function($value) {
    return preg_replace('/\@define(.+)/', '<?php ${1}; ?>', $value);
});

Then do one of the following:

Quick solution: If you are lazy, just put the code in the boot() function of the AppServiceProvider.php.

Nicer solution: Create an own service provider. See https://stackoverflow.com/a/28641054/2169147 on how to extend blade in Laravel 5. It's a bit more work this way, but a good exercise on how to use Providers :)

LARAVEL 4

You can just put the above code on the bottom of app/start/global.php (or any other place if you feel that is better).


After the above changes, you can use:

@define $i = 1

to define a variable.

Solution 2 - Php

It is discouraged to do in a view so there is no blade tag for it. If you do want to do this in your blade view, you can either just open a php tag as you wrote it or register a new blade tag. Just an example:

<?php
/**
 * <code>
 * {? $old_section = "whatever" ?}
 * </code>
 */
Blade::extend(function($value) {
    return preg_replace('/\{\?(.+)\?\}/', '<?php ${1} ?>', $value);
});

Solution 3 - Php

In [tag:laravel-4], you can use the template comment syntax to define/set variables.

Comment syntax is {{-- anything here is comment --}} and it is rendered by [tag:blade] engine as

<?php /* anything here is comment */ ?>

so with little trick we can use it to define variables, for example

{{-- */$i=0;/* --}}

will be rendered by [tag:blade]as <?php /* */$i=0;/* */ ?> which sets the variable for us. Without changing any line of code.

Solution 4 - Php

There is a simple workaround that doesn't require you to change any code, and it works in Laravel 4 just as well.

You just use an assignment operator (=) in the expression passed to an @if statement, instead of (for instance) an operator such as ==.

@if ($variable = 'any data, be it string, variable or OOP') @endif

Then you can use it anywhere you can use any other variable

{{ $variable }}

The only downside is your assignment will look like a mistake to someone not aware that you're doing this as a workaround.

Solution 5 - Php

Ya'll are making it too complicated.

Just use plain php

<?php $i = 1; ?>
{{$i}}

donesies.

(or https://github.com/alexdover/blade-set looks pretty straighforward too)

We're all kinda "hacking" the system by setting variables in views, so why make the "hack" more complicated then it needs to be?

Tested in Laravel 4.

Another benefit is that syntax highlighting works properly (I was using comment hack before and it was awful to read)

Solution 6 - Php

Since Laravel 5.2.23, you have the @php Blade directive, which you can use inline or as block statement:

@php($old_section = "whatever")

or

@php
    $old_section = "whatever"
@endphp

Solution 7 - Php

You Can Set Variables In The Blade Templating Engine The Following Ways:

1. General PHP Block
Setting Variable: <?php $hello = "Hello World!"; ?>
Output: {{$hello}}

2. Blade PHP Block
Setting Variable: @php $hello = "Hello World!"; @endphp
Output: {{$hello}}

Solution 8 - Php

You can set a variable in the view file, but it will be printed just as you set it. Anyway, there is a workaround. You can set the variable inside an unused section. Example:

@section('someSection')
  {{ $yourVar = 'Your value' }}
@endsection

Then {{ $yourVar }} will print Your value anywhere you want it to, but you don't get the output when you save the variable.

EDIT: naming the section is required otherwise an exception will be thrown.

Solution 9 - Php

In laravel document https://laravel.com/docs/5.8/blade#php You can do this way:

@php
     $my_variable = 123;
@endphp

Solution 10 - Php

In Laravel 4:

If you wanted the variable accessible in all your views, not just your template, View::share is a great method (more info on this blog).

Just add the following in app/controllers/BaseController.php

class BaseController extends Controller
{
  public function __construct()
  {                   
    // Share a var with all views
    View::share('myvar', 'some value');
  }
}

and now $myvar will be available to all your views -- including your template.

I used this to set environment specific asset URLs for my images.

Solution 11 - Php

And suddenly nothing will appear. From my experience, if you have to do something like this prepare the html in a model's method or do some reorganizing of your code in to arrays or something.

There is never just 1 way.

{{ $x = 1 ? '' : '' }}

Solution 12 - Php

I'm going to extend the answer given by @Pim.

Add this to the boot method of your AppServiceProvider

<?php
/*
|--------------------------------------------------------------------------
| Extend blade so we can define a variable
| <code>
| @set(name, value)
| </code>
|--------------------------------------------------------------------------
*/

Blade::directive('set', function($expression) {
	list($name, $val) = explode(',', $expression);
	return "<?php {$name} = {$val}; ?>";
});

This way you don't expose the ability to write any php expression.

You can use this directive like:

@set($var, 10)
@set($var2, 'some string')

Solution 13 - Php

Laravel 7 :

{{ $solution = "Laravel 7 is awesome and easy to use !!" }}

Solution 14 - Php

In Laravel 5.1, 5.2:

https://laravel.com/docs/5.2/views#sharing-data-with-all-views

> You may need to share a piece of data with all views that are rendered by your application. You may do so using the view factory's share method. Typically, you should place calls to share within a service provider's boot method. You are free to add them to the AppServiceProvider or generate a separate service provider to house them.

Edit file: /app/Providers/AppServiceProvider.php

<?php

namespace App\Providers;

class AppServiceProvider extends ServiceProvider
{        
    public function boot()
    {
        view()->share('key', 'value');
    }

    public function register()
    {
        // ...
    }
}

Solution 15 - Php

You may use the package I have published: https://github.com/sineld/bladeset

Then you easily set your variable:

@set('myVariable', $existing_variable)

// or

@set("myVariable", "Hello, World!")

Solution 16 - Php

As for my elegant way is like the following

{{ ''; $old_section = "whatever"; }}

And just echo your $old_section variable.

{{ $old_section }}

Solution 17 - Php

If you have PHP 7.0:

The simple and most effective way is with assignment inside brackets.

The rule is simple: Do you use your variable more than once? Then declare it the first time it's used within brackets, keep calm and carry on.

@if(($users = User::all())->count())
  @foreach($users as $user)
    {{ $user->name }}
  @endforeach
@else
  There are no users.
@endif

And yes, I know about @forelse, this is just a demo.

Since your variables are now declared as and when they are used, there is no need for any blade workarounds.

Solution 18 - Php

Assign variable to the blade template, Here are the solutions

We can use <?php ?> tag in blade page

<?php $var = 'test'; ?>
{{ $var }

OR

We can use the blade comment with special syntax

{{--*/ $var = 'test' /*--}}
{{ $var }}

Solution 19 - Php

I also struggled with this same issue. But I was able to manage this problem by using following code segment. Use this in your blade template.

<input type="hidden" value="{{$old_section = "whatever" }}">

{{$old_section }}

Solution 20 - Php

I don't think that you can - but then again, this kind of logic should probably be handled in your controller and passed into the view already set.

Solution 21 - Php

I was looking for a way to assign a value to a key and use it many times in my view. For this case, you can use @section{"key", "value"} in the first place and then call @yield{"key"} to output the value in other places in your view or its child.

Solution 22 - Php

Hacking comments is not a very readable way to do it. Also editors will color it as a comment and someone may miss it when looking through the code.

Try something like this:

{{ ''; $hello = 'world' }}

It will compile into:

<?php echo ''; $hello = 'world'; ?>

...and do the assignment and not echo anything.

Solution 23 - Php

It's better to practice to define variable in Controller and then pass to view using compact() or ->with() method.

Otherwise #TLGreg gave best answer.

Solution 24 - Php

There is a very good extention for Blade radic/blade-extensions. After you add it you can use @set(variable_name, variable_value)

@set(var, 33)
{{$var}}

Solution 25 - Php

In my opinion it would be better to keep the logic in the controller and pass it to the view to use. This can be done one of two ways using the 'View::make' method. I am currently using Laravel 3 but I am pretty sure that it is the same way in Laravel 4.

public function action_hello($userName)
{
    return View::make('hello')->with('name', $userName);
}

or

public function action_hello($first, $last)
{
    $data = array(
        'forename'  => $first,
        'surname' => $last
    );
    return View::make('hello', $data);
}

The 'with' method is chainable. You would then use the above like so:

<p>Hello {{$name}}</p>

More information here:

http://three.laravel.com/docs/views

http://codehappy.daylerees.com/using-controllers

Solution 26 - Php

I had a similar question and found what I think to be the correct solution with View Composers

View Composers allow you to set variables every time a certain view is called, and they can be specific views, or entire view templates. Anyway, I know it's not a direct answer to the question (and 2 years too late) but it seems like a more graceful solution than setting variables within a view with blade.

View::composer(array('AdminViewPath', 'LoginView/subview'), function($view) {
	$view->with(array('bodyClass' => 'admin'));
});

Solution 27 - Php

laravel 5 you can easily do this . see below

{{--*/ @$variable_name = 'value'  /*--}}

Solution 28 - Php

You can extend blade by using the extend method as shown below..

Blade::extend(function($value) {
    return preg_replace('/\@var(.+)/', '<?php ${1}; ?>', $value);
});

after that initialize variables as follows.

@var $var = "var"

Solution 29 - Php

inside the blade file, you can use this format

@php
  $i++
@endphp

Solution 30 - Php

In laravel8

@php

 $name="Abdul mateen";

{{ echo $name; }}
    
@endphp

Solution 31 - Php

works in all versions of blade.

{{--*/  $optionsArray = ['A', 'B', 'C', 'D','E','F','G','H','J','K'] /*--}}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionduality_View Question on Stackoverflow
Solution 1 - PhpPimView Answer on Stackoverflow
Solution 2 - PhpTLGregView Answer on Stackoverflow
Solution 3 - PhpTrying TobemyselfView Answer on Stackoverflow
Solution 4 - PhpBTMPLView Answer on Stackoverflow
Solution 5 - PhpSabrina LeggettView Answer on Stackoverflow
Solution 6 - PhpDaanView Answer on Stackoverflow
Solution 7 - PhpPrince AhmedView Answer on Stackoverflow
Solution 8 - PhpVasile GoianView Answer on Stackoverflow
Solution 9 - PhpHamidrezaView Answer on Stackoverflow
Solution 10 - PhpJustinView Answer on Stackoverflow
Solution 11 - PhpMichael J. CalkinsView Answer on Stackoverflow
Solution 12 - PhpCarson EvansView Answer on Stackoverflow
Solution 13 - PhpHicham O-SfhView Answer on Stackoverflow
Solution 14 - PhpJustinView Answer on Stackoverflow
Solution 15 - PhpSinan EldemView Answer on Stackoverflow
Solution 16 - PhpSet Kyar Wa LarView Answer on Stackoverflow
Solution 17 - PhpJonathanView Answer on Stackoverflow
Solution 18 - PhpNikunj K.View Answer on Stackoverflow
Solution 19 - PhpPasinduView Answer on Stackoverflow
Solution 20 - PhpDarren CraigView Answer on Stackoverflow
Solution 21 - PhpHafez DivandariView Answer on Stackoverflow
Solution 22 - PhprotaerczView Answer on Stackoverflow
Solution 23 - PhpMandeep GillView Answer on Stackoverflow
Solution 24 - Phpbelov91View Answer on Stackoverflow
Solution 25 - PhpRobert BrisitaView Answer on Stackoverflow
Solution 26 - PhpdugView Answer on Stackoverflow
Solution 27 - Phptapos ghoshView Answer on Stackoverflow
Solution 28 - PhpLakitha DiasView Answer on Stackoverflow
Solution 29 - PhpMurtdha DakhilView Answer on Stackoverflow
Solution 30 - PhpAbdul MateenView Answer on Stackoverflow
Solution 31 - PhpBakhtawar GIllView Answer on Stackoverflow