2

I'm trying to display flash data but it's not showing properly. It's showing:

{{ Session::get('flash_message') }}

but it should be the message

"Your article has been created"

What's wrong with my code? Thanks!

In my controller I have:

public function store(ArticleRequest $request) 
{ 
    Auth::user()->articles()->create($request->all());

    \Session::flash('flash_message', 'Your article has been created');

    return redirect('articles');            
}

My app.blade.php is:

<!DOCTYPE html>
    <head>
    <meta charset="UTF-8">
        <title>App Name - @yield('title')</title>
        <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css">
        <link rel="stylesheet" href="{{ elixir('css/all.css') }}">
        <script src= "http://ajax.googleapis.com/ajax/libs/angularjs/1.3.14/angular.min.js"></script>
        <script src="js/app.js"></script>
    </head>
    <body>

        <div class="container">

            @if(Session::has('flash_message'))
                <div class="alert alert-success">{{ Session::get('flash_message') }}</div>
            @endif

            @yield('content')

        </div>

        @yield('footer')

    </body>
</html>

In my route.php I have the following: Curly braces display content as string not variables.

<?php
Blade::setContentTags('<%', '%>'); // for variables and all things Blade
Blade::setEscapedContentTags('<%%', '%%>'); // for escaped data

Route::get('/', function() {
 return 'Home Page';
});

Route::get('blade', function () {
    return view('about');
});

   
Route::get('about', 'HelloWorld@about');

Route::get('foo', ['middleware' => 'manager', function() {
 return 'this page may only be viewed by managers';
}]);
   

Route:resource('articles', 'ArticlesController');

Route::controllers([
 'auth' => 'Auth\AuthController',
 'password' => 'Auth\PasswordController'

]);
ci_lover
  • 710
  • 1
  • 14
  • 38
  • Yes, I've written this - see my code but problem is that it is shown as: `{{ Session::get('flash_message') }}` not the message `"Your article has been created"` – ci_lover Sep 21 '15 at 12:55
  • Your code looks fine, but what you say is really weird !! Could you show your `routes.php` ? and when redirecting to `articles`, what do you do exactly ? – akmozo Sep 21 '15 at 12:56
  • I create a new article and then redirect to all articles. I thisnk problem is with {{ curly braces. It doesn't show message but it's shown as string. I'll update my question and add routes. – ci_lover Sep 21 '15 at 12:59

2 Answers2

5

If you have this in your route.php:

Blade::setContentTags('<%', '%>');

then that means you cannot use curly brackets for blade content. Try this instead:

@if(Session::has('flash_message'))
    <div class="alert alert-success">
        <% Session::get('flash_message') %>
    </div>
@endif

or simply remove the setContentTags() call from your route.php.

ciruvan
  • 5,143
  • 1
  • 26
  • 32
0

You can make a multiple messages and with different types. Follow these steps below:

  1. Create a file: "app/Components/FlashMessages.php"
namespace App\Components;

trait FlashMessages
{
  protected static function message($level = 'info', $message = null)
  {
      if (session()->has('messages')) {
          $messages = session()->pull('messages');
      }

      $messages[] = $message = ['level' => $level, 'message' => $message];

      session()->flash('messages', $messages);

      return $message;
  }

  protected static function messages()
  {
      return self::hasMessages() ? session()->pull('messages') : [];
  }

  protected static function hasMessages()
  {
      return session()->has('messages');
  }

  protected static function success($message)
  {
      return self::message('success', $message);
  }

  protected static function info($message)
  {
      return self::message('info', $message);
  }

  protected static function warning($message)
  {
      return self::message('warning', $message);
  }

  protected static function danger($message)
  {
      return self::message('danger', $message);
  }
}
  1. On your base controller "app/Http/Controllers/Controller.php".
namespace App\Http\Controllers;

use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Routing\Controller as BaseController;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
use Illuminate\Foundation\Auth\Access\AuthorizesResources;

use App\Components\FlashMessages;

class Controller extends BaseController
{
    use AuthorizesRequests, AuthorizesResources, DispatchesJobs, ValidatesRequests;

    use FlashMessages;
}

This will make the FlashMessages trait available to all controllers that extending this class.

  1. Create a blade template for our messages: "views/partials/messages.blade.php"
@if (count($messages))
<div class="row">
  <div class="col-md-12">
  @foreach ($messages as $message)
      <div class="alert alert-{{ $message['level'] }}">{!! $message['message'] !!}</div>
  @endforeach
  </div>
</div>
@endif
  1. On "boot()" method of "app/Providers/AppServiceProvider.php":
namespace App\Providers;

use Illuminate\Support\ServiceProvider; 

use App\Components\FlashMessages;

class AppServiceProvider extends ServiceProvider
{
  use FlashMessages;

    public function boot()
    {
        view()->composer('partials.messages', function ($view) {

          $messages = self::messages();

          return $view->with('messages', $messages);
      });
    }

    ...
}

This will make the $messages variable available to "views/partials/message.blade.php" template whenever it is called.

  1. On your template, include our messages template - "views/partials/messages.blade.php"
<div class="row">
  <p>Page title goes here</p>
</div>

@include ('partials.messages')

<div class="row">
  <div class="col-md-12">
      Page content goes here
  </div>
</div>

You only need to include the messages template wherever you want to display the messages on your page.

  1. On your controller, you can simply do this to push flash messages:
use App\Components\FlashMessages;

class ProductsController {

  use FlashMessages;

  public function store(Request $request)
  {
      self::message('info', 'Just a plain message.');
      self::message('success', 'Item has been added.');
      self::message('warning', 'Service is currently under maintenance.');
      self::message('danger', 'An unknown error occured.');

      //or

      self::info('Just a plain message.');
      self::success('Item has been added.');
      self::warning('Service is currently under maintenance.');
      self::danger('An unknown error occured.');
  }

  ...

Hope it'l help you.

clemquinones
  • 251
  • 2
  • 6