jabbott7_depaul
jabbott7_depaul

Reputation: 51

Getting "class does not exist" in Laravel 5.x

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:

http://laravel.io/bin/l59qa

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

Answers (1)

basementjack
basementjack

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:

  1. 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.

  2. 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

Related Questions