簡體   English   中英

Class App\Http\Controllers\PostController 不存在

[英]Class App\Http\Controllers\PostController does not exist

首先讓我說“我知道這個問題經常被問到”。 相信我,當我說什么都對我有用時。

我創建了一個名為 PostController 的PostController 這是我博客的 controller。 當我導航到我的博客時,出現以下錯誤Class App\Http\Controllers\PostController does not exist ,即使它確實存在。 controller 稱為PostController.php 這是路由的樣子Route::get('blog','PostController@index'); . 我讀過運行一些composer命令會有所幫助,但沒有一個對我有幫助。 composer dumpautoload以及composer 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;

這是整個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);
    }


}

謝謝。

打開 App\\Provider\\RouteServiceProvider.php 並添加這一行

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

在這個下面

public const HOME = '/home';

你的錯誤就會消失。

如果composer dumpautoload是沒有幫助,然后檢查是否有適當的namespace中聲明PostController.php和類名/路由聲明錯別字雙重檢查。

如果這失敗,請檢查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;

在文件開始時, <?php declare(strict_types = 1); <?php<?php declare(strict_types = 1); 如果您使用的是 php7 嚴格模式

打開 App\\Providers\\RouteServiceProvider.php 並取消注釋行:

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

謝謝,這個方法對我有幫助!

如果你使用 laravel 8.* 然后打開 App->Providers>RouteServiceProvider.php 並取消注釋這一行:

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

這發生在我從 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 可調用語法。 另一種解決方案是其他人提到的,並添加受保護的 $namespace = 'App\\Http\\Controllers'; RouteServiceProvider

簡單地說,您必須將 class 添加到routes\web.php文件中,如下所示:

use App\Http\Controllers\PostController;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM