【问题标题】:Class App\Http\Controllers\PostController does not exist类 App\Http\Controllers\PostController 不存在
【发布时间】:2016-06-22 18:40:13
【问题描述】:

让我先说“我知道这个问题经常被问到”。当我说对我没有任何帮助时,请相信我。

我创建了一个名为PostController 的控制器。这是我博客的控制器。当我导航到我的博客时,我收到以下错误Class App\Http\Controllers\PostController does not exist,即使它确实存在。控制器称为PostController.php。这是路线的样子Route::get('blog','PostController@index');。我读过运行一些composer 命令会有所帮助,但它们都没有帮助我。 composer dumpautoloadcomposer update。我在这里错过了一些步骤吗?有人遇到类似的问题吗?如果需要更多信息,请告诉我。

编辑 这是顶部的命名空间。

use App\Http\Controllers;
use App\Posts;
use App\User;
use App\Http\Controllers\Controller;
use App\Http\Requests\PostFormRequest;
use Illuminate\Http\Request;

这是整个控制器。

<?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);
    }


}

谢谢。

【问题讨论】:

  • 你从哪里打电话blog你能分享我们吗?
  • 你的控制器类有命名空间吗?
  • 请参阅帖子中的命名空间。

标签: php laravel-5 controller


【解决方案1】:

如果 composer dumpautoload 没有帮助,请检查您在 PostController.php 中是否有正确的 namespace 声明,并仔细检查类名/路由声明中的拼写错误。

如果检查 composer.json 的自动加载配置失败,它应该是这样的:

"autoload": {
    "psr-4": {
        "App\\": "app/"
    }
},

作为旁注,您可以使用以下内容:

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

Route::get('blog',\App\Http\Controllers\PostController::class . '@index');

有了这个,任何像样的 IDE 都应该在找不到文件/有错字时给出某种警告

编辑

你的文件应该有这样一行

namespace App\Http\Controllers;

在文件的开头,如果您使用的是 php7 严格模式,则在 &lt;?php&lt;?php declare(strict_types = 1); 之后

【讨论】:

  • 您好,我已经检查并重新检查了我的拼写大约 50 次。我检查了我的 composer.json 文件,你提到的内容在那里。
  • 我看到你用你使用的命名空间更新了你的问题,但是你在 PostController.php 中有&lt;?php namespace App\Http\Controllers; 吗?
  • @IE5Master 你能用整个 PostController.php 更新你的帖子吗?
  • 我已经添加了整个控制器
  • 是的,文件顶部没有namespace 声明。你有use 声明,但你没有声明这个类在namespace App\Http\Controllers;
【解决方案2】:

打开 App\Provider\RouteServiceProvider.php 并添加 这一行

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

下面

public const HOME = '/home';

你的错误就会消失。

【讨论】:

    【解决方案3】:

    打开 App\Providers\RouteServiceProvider.php 并取消注释行:

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

    谢谢你,这个方法对我的帮助!

    【讨论】:

      【解决方案4】:

      如果你使用 laravel 8.* 则打开 App->Providers>RouteServiceProvider.php 并取消注释此行:

      受保护的 $namespace = 'App\Http\Controllers';

      【讨论】:

        【解决方案5】:

        这发生在我从 Laravel 7.x 升级到 8.x 的过程中。我的解决方法是更改​​我的路由:

        Route::resource('posts', 'PostController');
        

        到:

        Route::resource('posts', \App\Http\Controllers\PostController::class);
        

        或者如果你导入 PostController 类:

        Route::resource('posts', PostController::class);
        

        从 Laravel 7.x 升级到 8.x 指南中解释了这种变化的原因: https://laravel.com/docs/8.x/upgrade#routing

        它解释说它 8.x 支持允许路由声明使用标准的 PHP 可调用语法。另一种解决方案是其他人提到的,并将 protected $namespace = 'App\Http\Controllers'; 添加到 RouteServiceProvider

        【讨论】:

          【解决方案6】:

          简单地说,您必须将类添加到 routes\web.php 文件中,如下所示:

          use App\Http\Controllers\PostController;
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-02-20
            • 1970-01-01
            • 1970-01-01
            • 2017-12-23
            • 2020-05-01
            • 1970-01-01
            • 2021-02-07
            相关资源
            最近更新 更多