Reputation: 51
I'm getting the error: Class App\Http\Controllers\TranslatorService does not exist
regardless of the namespace being set in the controller correctly and the file being in the correct location.
route.php:
Route::group(['prefix' => 'api', 'middleware' => 'response-time'], function () {
Route::group(['prefix' => 'v1'], function () {
Route::get('/', function () {
App::abort(404);
});
Route::resource('accounts', 'AccountController');
});
Route::group(['prefix' => 'v2'], function () {
Route::get('/', function () {
App::abort(501, 'Feature not implemented');
});
});
});
AccountController.php
under app/ComdexxSolutions/Http/Controllers
is a standard skeleton controller.
TranslationService.php
is under the same path as AccountController
and looks like:
<?php
namespace ComdexxSolutions\Http\Controllers;
use InvalidArgumentException;
use RuntimeException;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
class TranslatorService
{
/**
* Returns a class name base on a resource mapping.
* The mapping comes from a config file (api.php).
*
* Example: `users` should return `\App\Models\User`
*
* @param string $resource
* @return string
* @throws NotFoundHttpException
*/
public function getClassFromResource($resource)
{
// This is the models namespace
$modelsNamespace = Config::get('api.models_namespace', Config::get('api.app_namespace'));
// This array contains mapping between resources and Model classes
$mapping = Config::get('api.mapping');
if (!is_array($mapping)) {
throw new RuntimeException('The config api.mapping needs to be an array.');
}
if (!isset($mapping[$resource])) {
throw new NotFoundHttpException;
}
return implode('\\', [$modelsNamespace, $mapping[$resource]]);
}
/**
* Returns a command class name based on a resource mapping.
*
* Examples:
* - getCommandFromResource('users', 'show') returns \App\Commands\UserCommand\ShowCommand
* - getCommandFromResource('users', 'index', 'groups') returns \App\Commands\UserCommand\GroupIndexCommand
*
* @param string $resource
* @param string $action
* @param string|null $relation
* @return string
* @throws NotFoundHttpException
*/
public function getCommandFromResource($resource, $action, $relation = null)
{
$namespace = Config::get('api.app_namespace');
$mapping = Config::get('api.mapping');
// If the mapping does not exist, we consider this as a 404 error
if (!isset($mapping[$resource])) {
throw new NotFoundHttpException('The resource [' . $resource . '] is not mapped to any Model.');
}
$allowedActions = ['index', 'store', 'show', 'update', 'destroy'];
if (!in_array($action, $allowedActions)) {
throw new InvalidArgumentException('[' . $action . '] is not a valid action.');
}
// If we have a $relation parameter, then we generate a command based on it
if ($relation) {
if (!isset($mapping[$relation])) {
throw new NotFoundHttpException('The resource [' . $resource . '] is not mapped to any Model.');
}
$command = implode('\\', [
$namespace,
'Commands',
$mapping[$resource] . 'Command',
ucfirst($mapping[$relation]) . ucfirst($action) . 'Command'
]);
} else {
$command = implode('\\', [
$namespace,
'Commands',
$mapping[$resource] . 'Command',
ucfirst($action) . 'Command'
]);
}
// If no custom command is found, then we use one of the default ones
if (!class_exists($command)) {
if ($relation) {
$command = implode('\\', [
'ComdexxSolutions',
'Console',
'Commands',
'DefaultCommand',
'Relation' . ucfirst($action) . 'Command'
]);
} else {
$command = implode('\\', [
'ComdexxSolutions',
'Console',
'Commands',
'DefaultCommand',
ucfirst($action) . 'Command'
]);
}
}
if (!class_exists($command)) {
throw new NotFoundHttpException('There is no default command for this action and resource.');
}
return $command;
}
}
Directory Structure:
vagrant@homestead:~/Code/comdexx-solutions-dcas$ tree -L 2 app app ├── ComdexxSolutions │ ├── Billing │ ├── Console │ ├── Contracts │ ├── DbCustomer.php │ ├── Events │ ├── Exceptions │ ├── Facades │ ├── Http │ ├── InvokeUser.php │ ├── Jobs │ ├── Listeners │ ├── Models │ ├── Providers │ ├── Repositories │ ├── Search │ ├── Services │ ├── spec │ ├── Traits │ ├── Transformers │ └── Views ├── Console │ ├── Commands │ └── Kernel.php ├── Entities ├── Events │ └── Event.php ├── Exceptions │ └── Handler.php ├── Http │ ├── Controllers │ ├── Kernel.php │ ├── Middleware │ ├── Requests │ └── routes.php ├── Jobs │ └── Job.php ├── Listeners ├── Modules ├── Providers │ ├── AppServiceProvider.php │ ├── ErrorServiceProvider.php │ ├── EventServiceProvider.php │ └── RouteServiceProvider.php ├── Repositories └── User.php 33 directories, 13 files
Upvotes: 2
Views: 12407
Reputation: 566
Just a quick follow up on this one - I helped this user on IRC and we ended up doing a webex. The root cause ended up being that a totally different file than what was posted above.
In controller.php there was a call to TranslatorService
, but the correct namespace wasn't present for controller to find TranslatorService. Hence the error.
It was a little harder to find because the error didn't flag as coming from controller.php
The user who posted the question ended up doing a global search on TranslatorService across his project, and we looked at each file it was found in until we found the issue.
If you're reading this because you have a similar error, a few tips to remember are:
class does not exist
- usually means you're trying to use something in your code that can't be found. It might be misspelled but more often than not, it's an issue with namespaces.
If you have this error - the technique of searching everything can be a great way to find where this is coming from if it's not immediately obvious.
Upvotes: 2