Reputation: 413
Let me just start by saying "I know this question gets asked a lot." believe me when i say nothing has worked for me.
I have created a controller called PostController
. This is a controller for my blog. When I navigate to my blog i get the following error Class App\Http\Controllers\PostController does not exist
even though it does exist. The controller is called PostController.php
. Here is what the route looks like Route::get('blog','PostController@index');
. I have read that running some composer
commands will help but none of them have helped me. composer dumpautoload
as well as composer update
. Am i missing some step here? Anyone run into a similar problem? Please let me know if additional information is needed.
EDIT Here are the namespaces at the top.
use App\Http\Controllers;
use App\Posts;
use App\User;
use App\Http\Controllers\Controller;
use App\Http\Requests\PostFormRequest;
use Illuminate\Http\Request;
Here is the whole Controller.
<?php
use App\Http\Controllers;
use App\Posts;
use App\User;
use App\Http\Controllers\Controller;
use App\Http\Requests\PostFormRequest;
use Illuminate\Http\Request;
class PostController extends Controller {
/**
* Display a listing of the resource.
*
* @return Response
*/
public function index()
{
//fetch 5 posts from database which are active and latest
$posts = Posts::where('active',1)->orderBy('created_at','desc')->paginate(5);
//page heading
$title = 'Latest Posts';
//return home.blade.php template from resources/views folder
return view('blog/home')->withPosts($posts)->withTitle($title);
}
/**
* Show the form for creating a new resource.
*
* @return Response
*/
public function create(Request $request)
{
// if user can post i.e. user is admin or author
if($request->user()->can_post())
{
return view('blog.create');
}
else
{
return redirect('blog');
}
}
/**
* Store a newly created resource in storage.
*
* @return Response
*/
public function store(PostFormRequest $request)
{
$post = new Posts();
$post->title = $request->get('title');
$post->body = $request->get('body');
$post->slug = str_slug($post->title);
$post->author_id = $request->user()->id;
if($request->has('save'))
{
$post->active = 0;
$message = 'Post saved successfully';
}
else
{
$post->active = 1;
$message = 'Post published successfully';
}
$post->save();
return redirect('edit/'.$post->slug)->withMessage($message);
}
/**
* Display the specified resource.
*
* @param int $id
* @return Response
*/
public function show($slug)
{
$post = Posts::where('slug',$slug)->first();
if(!$post)
{
return redirect('/')->withErrors('requested page not found');
}
$comments = $post->comments;
return view('posts.show')->withPost($post)->withComments($comments);
}
/**
* Show the form for editing the specified resource.
*
* @param int $id
* @return Response
*/
public function edit(Request $request,$slug)
{
$post = Posts::where('slug',$slug)->first();
if($post && ($request->user()->id == $post->author_id || $request->user()->is_admin())){
return view('posts.edit')->with('post',$post);
}
return redirect('blog')->withErrors('you have not sufficient permissions');
}
/**
* Update the specified resource in storage.
*
* @param int $id
* @return Response
*/
public function update(Request $request)
{
//
$post_id = $request->input('post_id');
$post = Posts::find($post_id);
if($post && ($post->author_id == $request->user()->id || $request->user()->is_admin()))
{
$title = $request->input('title');
$slug = str_slug($title);
$duplicate = Posts::where('slug',$slug)->first();
if($duplicate)
{
if($duplicate->id != $post_id)
{
return redirect('edit/'.$post->slug)->withErrors('Title already exists.')->withInput();
}
else
{
$post->slug = $slug;
}
}
$post->title = $title;
$post->body = $request->input('body');
if($request->has('save'))
{
$post->active = 0;
$message = 'Post saved successfully';
$landing = 'edit/'.$post->slug;
}
else {
$post->active = 1;
$message = 'Post updated successfully';
$landing = $post->slug;
}
$post->save();
return redirect($landing)->withMessage($message);
}
else
{
return redirect('blog')->withErrors('you have not sufficient permissions');
}
}
/**
* Remove the specified resource from storage.
*
* @param int $id
* @return Response
*/
public function destroy(Request $request, $id)
{
//
$post = Posts::find($id);
if($post && ($post->author_id == $request->user()->id || $request->user()->is_admin()))
{
$post->delete();
$data['message'] = 'Post deleted Successfully';
}
else
{
$data['errors'] = 'Invalid Operation. You have not sufficient permissions';
}
return redirect('blog')->with($data);
}
}
Thanks.
Upvotes: 7
Views: 44521
Reputation: 1
It is actually really simple you just got to change
Route::get('blog','PostController@index');
to this Route::get('blog',[PostController::class, 'index']);
Upvotes: 0
Reputation: 152
Open App\Providers\RouteServiceProvider.php and uncomment or add the row:
protected $namespace = 'App\\Http\\Controllers';
Upvotes: 4
Reputation: 536
Simply, You would have to add class into the routes\web.php file as given below:
use App\Http\Controllers\PostController;
Upvotes: 0
Reputation: 1194
This happened in my upgrade from Laravel 7.x to 8.x. My fix was to change my routing from:
Route::resource('posts', 'PostController');
to:
Route::resource('posts', \App\Http\Controllers\PostController::class);
or if you import the PostController class:
Route::resource('posts', PostController::class);
The reason for this change is explained in the upgrade from Laravel 7.x to 8.x guide: https://laravel.com/docs/8.x/upgrade#routing
It explains that it 8.x provides support to allow route declarations to use standard PHP callable syntax. The alternative solution is what others have mentioned, and add protected $namespace = 'App\Http\Controllers'; to RouteServiceProvider.
Upvotes: 0
Reputation: 21
if you use laravel 8.* then Open App->Providers>RouteServiceProvider.php and uncomment this line:
protected $namespace = 'App\Http\Controllers';
Upvotes: 2
Reputation: 91
Open App\Provider\RouteServiceProvider.php and add this line
protected $namespace = 'App\Http\Controllers';
below this
public const HOME = '/home';
and your error will vanish.
Upvotes: 8
Reputation: 939
If composer dumpautoload
is not helping then check if you have proper namespace
declaration in PostController.php
and double check for typos in class name/route declaration.
If this fails check composer.json
for autoload configuration, it should have something like this:
"autoload": {
"psr-4": {
"App\\": "app/"
}
},
As a side note you could use something like this:
Route::get('blog',PostController::class . '@index');
or
Route::get('blog',\App\Http\Controllers\PostController::class . '@index');
With this any decent IDE should give some kind of a warning if it can't find the file/there's a typo
Edit:
Your file should have a line like this
namespace App\Http\Controllers;
At the beggining of the file, right after <?php
or <?php declare(strict_types = 1);
if you're using php7 strict mode
Upvotes: 6