Reputation: 420
I'm quite new to Laravel and when I am going through a tutorial when I encountered this error. This is my code in 'testController.php'.
<?php
namespace app\Http\Controllers;
use app\Http\Controllers\Controller;
class testController extends \app\Http\Controllers\Controller {
public function getAbout()
{
return view('Learning.about') ;
}
public function getHome()
{
return view('Learning.index');
}
}
And this is my 'routes.php'.
<?php
Route::get('test', [
'as' => 'test',
'uses' => 'testController@getHome',
]);
Route::get('about', [
'as' => 'about',
'uses' => 'testController@getAbout',
]);
I am getting this error:
Class 'app\Http\Controllers\Controller' not found
How can I fix this error?
Upvotes: 3
Views: 23360
Reputation: 4564
In some cases the problem is that the framework is not able to instantiate your given controller class. This can happen for example if you are using a sub-folder under Controllers
and that when you are extending the Controller.php
class, you did not provide the use
statement to that definition*. Other run-time errors may also cause this.
*Which is now required since your own controller is not at the root of the Controller
folder anymore.
Upvotes: 0
Reputation: 497
Include this at the top of your Controller file. This fixed it for me.
namespace App\Http\Controllers;
Upvotes: 0
Reputation: 13709
According to my experience in Laravel projects, the namespaces starts with the capital A
of App
used in namespace, you should try to change your code to this:
namespace App\Http\Controllers;
class testController extends Controller { }
Also check if the controller - App\Http\Controllers\Controller
lies in the same namespace as mentioned in your code.
Upvotes: 0
Reputation: 4684
Let's go through this step by step.
Open composer.json
file on your project root directory. Locate the the autoload
section. It should be looking like this:
{
...
"autoload": {
"classmap": [
"database"
],
"psr-4": {
"App\\": "app/"
}
},
}
Make sure you have this configuration under the psr-4
option:
"App\\": "app/"
This configuration tells the composer that we want to autoload all classes inside the app
directory using psr-4 convention and places it under the App
namespace.
First, your controller file name should be in CamelCase style. So we have to renamed it to TestController.php
. Make sure that it's saved under app/Http/Controllers
directory.
Now open your TestController.php
file, we have to capitalize the namespace and class name like so:
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
class TestController extends Controller {
public function getAbout()
{
return view('Learning.about') ;
}
public function getHome()
{
return view('Learning.index');
}
}
Note that we also turn this line:
class testController extends \app\Http\Controllers\Controller
Into:
class TestController extends Controller
Since we already import the base Controller
class, we don't have to specify the fully qualified name. We imported the Controller
class using the use
keyword:
use App\Http\Controllers\Controller;
Save your TestController.php
file.
Now we have to update our app\Http\routes.php
file. We just need to capitalize the controller name:
<?php
Route::get('test', ['uses' => 'TestController@getHome', 'as' => 'test']);
Route::get('about', ['uses' => 'TestController@getAbout', 'as' => 'about']);
Now the last thing to do. Open your terminal / command prompt. Go to your project directory and run the following command:
composer dump-autoload
This command will update the autoloader file (Read more here).
Now if you open up your browser and hit /test
route, you should see the content from resources/views/Learning/index.blade
.
Upvotes: 6
Reputation: 163968
Use correct namespace:
namespace App\Http\Controllers;
// Remove: use app\Http\Controllers\Controller;
class testController extends Controller {
Upvotes: 0