Class App\Http\Controllers\PostController does not exist
Asked Answered
A

7

7

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.

Anabas answered 22/6, 2016 at 18:40 Comment(3)
From where you are calling blog can you share us?Ware
Do you have a namespace on your controller class?Ammo
Please see namespaces in the post.Anabas
C
6

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

Charo answered 22/6, 2016 at 18:48 Comment(6)
Hello, I have checked and rechecked my spelling about 50 times. I checked my composer.json file and the contents you mentioned are in there.Anabas
I see you updated your question with namespaces you use but do you have <?php namespace App\Http\Controllers; in PostController.php?Charo
@Anabas Can you update your post with whole PostController.php?Charo
I have added the whole controllerAnabas
Yep, you don't have namespace declaration at the top of the file. You have use statements but you didn't declare that this class is in namespace App\Http\Controllers;Charo
Brilliant. Looked over one easy step.Anabas
U
8

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.

Undertook answered 12/10, 2020 at 10:38 Comment(0)
C
6

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

Charo answered 22/6, 2016 at 18:48 Comment(6)
Hello, I have checked and rechecked my spelling about 50 times. I checked my composer.json file and the contents you mentioned are in there.Anabas
I see you updated your question with namespaces you use but do you have <?php namespace App\Http\Controllers; in PostController.php?Charo
@Anabas Can you update your post with whole PostController.php?Charo
I have added the whole controllerAnabas
Yep, you don't have namespace declaration at the top of the file. You have use statements but you didn't declare that this class is in namespace App\Http\Controllers;Charo
Brilliant. Looked over one easy step.Anabas
O
4

Open App\Providers\RouteServiceProvider.php and uncomment or add the row:

protected $namespace = 'App\\Http\\Controllers';
Otero answered 27/9, 2020 at 7:47 Comment(0)
L
2

if you use laravel 8.* then Open App->Providers>RouteServiceProvider.php and uncomment this line:

protected $namespace = 'App\Http\Controllers';

Leidaleiden answered 2/12, 2020 at 11:13 Comment(0)
V
0

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.

Vivisection answered 9/5, 2021 at 1:32 Comment(0)
T
0

Simply, You would have to add class into the routes\web.php file as given below:

use App\Http\Controllers\PostController;
Troy answered 2/9, 2021 at 9:34 Comment(0)
A
0

It is actually really simple you just got to change

Route::get('blog','PostController@index');

to this Route::get('blog',[PostController::class, 'index']);

Apochromatic answered 15/9, 2023 at 10:5 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.