Undefined variable Laravel (strange case) - laravel

I am m having this annoying problem. Can anyone give a hand to sort out it? I read all posts and I cannot find the solution.
This is my controller
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Auth;
use DB;
use App\Post;
use App\RegisteredCourse;
class DashboardsController extends Controller
{
public function indexA()
{
return view('dashboards.admin-dashboard');
}
public function indexS()
{
$id = Auth::user()->id;
$courses = DB::table('registered__courses')->select('user_id')->where('user_id', '=', $id)->count();
$posts = Post::all();
return view('dashboards.student-dashboard', compact('id', 'courses', 'posts'));
}
public function indexT()
{
return view('dashboards.teacher-dashboard');
}
}
This is a fragment of the blade view. The name of the view is dashboards.student-dashboard
<div class="col-md-12">
<div class="card">
<div class="card-header">
<h3 class="card-title">Posts</h3>
</div>
<div class="card-body">
<div class="tab-content">
<div class="active tab-pane" id="activity">
<!-- Post -->
<!--forEACH-->
#foreach ($posts as $post)
<div class="post">
<div class="user-block">
<span class="username">
{{$post->title}} | {{$post->author}}
</span>
<span class="description">{{optional($post->created_at)->format('d-m-Y')}}</span>
</div>
<!-- /.user-block -->
<p>
{{$post->content}}
</p>
</div>
#endforeach
</div>
</div>
</div>
</div>
</div>
And these are the routes
Route::group(['prefix' => 'dashboard',], function () {
Route::get('/admin', 'DashboardsController#indexA')->name('dashboards.indexA');
Route::get('/teacher', 'DashboardsController#indexT')->name('dashboards.indexT');
Route::get('/student', 'DashboardsController#indexS')->name('dashboards.indexS');
});
I tried to pass al the variable to the view and I always have the same problem. ("Undefined variable").It seems like blocked the possibility to pass variable to the blade view.
What I did before:
1-dd($posts) It does not working, it appears the exception "Undefined variable: posts".
2- I remove the whole content of the blade file and I tried with a simple varible and it stills appearing the exception "Undefined variable".
3- I ran php artisan view:clear and restarted the server.
Any sugestions?
Thank you very much.

Instead of
return view('dashboards.student-dashboard', compact('id', 'courses', 'posts'));
try
return view('dashboards.student-dashboard', ['id'=>$id, 'courses'=>$courses, 'posts'=>$posts]);

Related

The #edit Route is not working... showing 404 not found

the #edit route is not creating. everything is ok but showing 404 not found
the problem is on the last route. I ran the php artisan route:list code but not showing any route named /profile/{user}/edit
the web.php code ->>>>>
<?php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\ProfilesController;
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/
Route::get('/', function () {
return view('welcome');
});
Auth::routes();
Route::get('/p/{post}','App\Http\Controllers\PostsController#show');
Route::get('/p/create','App\Http\Controllers\PostsController#create');
Route::post('/p','App\Http\Controllers\PostsController#store');
Route::get('/profile/{user}', [App\Http\Controllers\ProfilesController::class, 'index'])->name('profile.show');
Route::get('/profile/{user}/edit','ProfilesController#edit')->name('profile.edit');
the profiles controller code ->>>>>
<?php
namespace App\Http\Controllers;
use App\Models\User;
use Illuminate\Http\Request;
class ProfilesController extends Controller
{
public function edit(User $user)
{
return view('profiles.edit', compact('user'));
}
public function index(User $user)
{
return view('profiles.index', compact('user'));
}
}
the index.blade.php code --->>>>>>>>>>>>>>>
#extends('layouts.app')
#section('content')
<div class="container">
<div><h1>here is a big design</h1></div>
<br>
<div class="d-flex justify-content-between align-items-baseline">
<h1>{{ $user->username}}</h1>
Add New Post
</div>
Edit Profile
<div class="pr-5"><strong>{{$user->posts->count()}}</strong> posts</div>
<div class="pr-5"><strong></strong> followers</div>
<div class="pr-5"><strong></strong> following</div>
<br>
<div><h1>{{ $user->profile->title}}</h1></div>
<br>
<div><h1>{{ $user->profile->description}}</h1></div>
<br>
<div><h1>{{ $user->profile->url ?? 'N/A'}}</h1></div>
<h1>Posts</h1>
<hr>
<div class="row pt-5">
#foreach($user->posts as $post)
<div class="col-4 pb-4">
<a href="/p/{{$post->id}}">
<img src="/storage/{{$post->image}}" class="w-100">
</a>
</div>
#endforeach
</div>
</div>
#endsection
Change your route to
Route::get('/profile/{user}/edit',[ProfilesController::class, 'edit'])->name('profile.edit');
Your way 'ProfilesController#edit' doesn't take use App\Http\Controllers\ProfilesController; into account.
Offtopic suggestion: since you already named your routes I suggest you use the named routes in your blade files instead of hardcoding them:
Edit Profile
instead of
Edit Profile
This way, should you decide to change a URL some time later, you only need to change it in your web.php file once, not all of your hardcoded occurences

Laravel reports error "Parameter must be an array or an object that implements Countable"

This is the error:
"count(): Parameter must be an array or an object that implements
Countable (View: C:\xampp\htdocs\blog\resources\views\inc\sidebar.blade.php)"
This is my views/inc/sidebar.blade.php:
#if(count($articles)>0)
#foreach($articles as $article)
{{$article->title}}
#endforeach
#endif
Here is my controller:
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Article;
class HomepageController extends Controller
{
public function sidebar(){
$articles = Article::orderBY('created_at', 'desc')->where('active', '1')->take(2)->get();
return view('inc.sidebar')->with('articles', $articles);
}
}
And on my views/pages/view_article.blade.php
#extends('layouts.layout')
#section('content')
<div class="container">
<div class="row no-gutters" style="margin-top: 10px;margin-left: 5px;margin-right: 5px; min-height: 450px;">
<div class="col-md-9 tex-justify">
<table class="table-responsive">
<tr><td>{{$articles->title}}</td></tr>
<tr><td>{{$articles->created_at->format('M d Y')}}</td></tr>
</table>
<img src="/img/{{$articles->img_article}}">{!!$articles->body!!}</div>
</div>
<div class="col-md-3">
#include('inc.sidebar')
</div>
</div>
</div><br>
#endsection
What am I doing wrong?
The use of orderBY instead of orderBy might be the problem, but if that's not the issue, try replacing:
$articles = Article::orderBY('created_at', 'desc')->where('active', '1')->take(2)->get();
with:
$articles = Article::orderBy('created_at', 'desc')->where('active', '1')->take(2)->get()->all();
The reason behind this is that Illuminate\Database\Query\Builder::get returns an Illuminate\Support\Collection, not an array, whereas Illuminate\Support\Collection::all returns a straight array containing the items in the collection which works with count.
Use #if(isset($articles[0]->id) instead of #if(count($articles)>0)

Undefined variable: names

I am facing difficulties pushing data from the Controller to the View. Below is my code script.
I created my controller ListController using artisan
php artisan make:controller ListController
ListController - show method
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class ListController extends Controller
{
public function listNames()
{
$names = array(
'Daenerys Targaryen',
'Jon Snow',
'Arya Stark',
'Melisandre',
'Khal Drogo'
);
return view('welcome', ['names' => $names]);
}
}
Created a view welcome.blade.php (which is default)
#extends('layouts.app')
#section('content')
<div class="container">
<div class="row">
<div class="col-md-8 col-md-offset-2">
<div class="panel panel-default">
<div class="panel-heading">API DOCUMENTATION</div>
<div class="panel-body">
#foreach ($names as $n)
<p>{{$n}}</p>
#endforeach
</div>
</div>
</div>
</div>
</div>
#endsection
Then, added the appropriate route for it (routes.php)
<?php
Route::get('/', 'ListController#listNames');
When opening localhost:8000 after running php artisan serve, it throws an Exception
ErrorException in 56f6d37e6c39b528e3f5a170141b734befe0f7a2.php line 14:
Undefined variable: names (View: /Applications/MAMP/.../views/welcome.blade.php)
So far I have tried the following:
In the Controller:
return view('welcome', compact('names')); --> DOESN'T WORK
return view('welcome', $names); --> DOESN'T WORK
return view('welcome')->with($names); --> DOESN'T WORK
return view('welcome')->with('names', $names); --> DOESN'T WORK
Hard coding the array in the view and assigning it a variable works
<?php $names = array('John Snow', 'Arya Stark');?>
<?php foreach ($names as $n):?>
<tr>
<td><?php echo $n;?></td>
</tr>
<?php endforeach;?>
I can't seem to detect the problem. Any help is appreciated.
You should pass variables using an array:
return view('welcome', ['names' => $names]);
Or just:
return view('welcome', compact('names'));
To check it do this in the view:
{{ dd($names) }}
First, pass your variables as Alexey said,
return view('welcome', ['names' => $names]);
And then, on the view, do
#foreach ($names as $n)
<p>This is name {{ $n }}</p>
#endforeach
Documentation here: https://laravel.com/docs/master/blade#displaying-data
Managed to resolve the issue.
After spending so much time looking for the bug, I tried to check if laravel version could have something to do with this. The routes.php doesn't work in Laravel v5.3+ and I was using Laravel v5.4.x.
The routes are available in a directory called routes and so I pasted the code from routes.php to routes/web.php and it worked.
<?php
Route::get('/', 'ListController#listNames');

Undfined variable 'posts' - Laravel 5

In my ShowController, I returned a view with variable posts, like
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Depress;
use DB;
use App\Http\Requests;
class ShowController extends Controller
{
public function showPost(Request $request)
{
$posts = Depress::all();
return view('homeview')->with('posts', $posts);
}
}
And in my, homeview.blade.php ,
#foreach($posts as $post)
<div class="panel panel-default">
<div class="panel-heading">{{ $post->name }}</div>
<div class="panel-body">
{{ $post->depression }}
</div>
</div>
#endforeach
But, it's showing,
Undefined Variable: posts
Can anyone please help ?
The posts variable is in session. So use Session::get('posts') to get it.
Or use return view('homeview', compact('posts')); and $posts will be available in view as php variable.
add use App\Post; to your ShowController

Laravel:Passing variable from controller to view

chatcontroller.php function returns variable to view:
public function getChat()
{
$message = chat_messages::all();
return View::make('home',compact($message));
}
this is my route:
Route::get('/getChat', array('as' => 'getChat','uses' => 'ChatController#getChat'));
this is my home.blade.php:
#extends('layouts.main')
#section('content')
<div class="container">
<h2>Welcome to Home Page!</h2>
<p> <a href="{{ URL::to('/logout') }}" > Logout </a></p>
<h1>Hello <span id="username">{{ Auth::user()->username }} </span>!</h1>
<div id="chat_window">
</div>
<input type="text" name="chat" class="typer" id="text" autofocus="true" onblur="notTyping()">
</div>
<ul>
#foreach($message as $msg)
<li>
{{ $msg['sender_username']," says: ",$msg['message'],"<br/>" }}
</li>
#endforeach
</ul>
<script src="{{ asset('js/jquery-2.1.3.min.js') }}"></script>
<script src="{{ asset('js/chat.js') }}"></script>
#stop
I am trying to send result returned by select query to view from controller.
when I do this from homecontroller.php then it works fine.
if I try to pass from controller which I have defined it gives error message as:Undefined variable.
I have used the extends \BaseController do i need to do anything else to access my controller variable from view.
please suggest some tutorial if possible for same.
Verify the route to be sure it uses the new controller:
Route::get('user/profile', array('uses' => 'MyDefinedController#showProfile'));
First of all check your routes, as Matei Mihai says.
There are two different ways to pass data into your view;
$items = Item::all();
// Option 1
return View::make('item.index', compact('items'));
// Option 2
return View::make('item.index')->with('items', $items); // same code as below
// Option 3
View::share('item.index', compact('items'));
return View::make('item.index);
You can also do this:
$this->data['items'] = Item::all();
return View::make('item.index', $this->data);

Resources