CodeIgniter Forums

Full Version: Classmap not loaded?
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Hi board!

I am trying to locate a custom library out of `ThirdParty/` using the classmap instead of PSR-4. 

I have been successful using the PSR-4 namespace autoloader, but as this is my auth library and will be run frequently, I want to realize the performance of the classmap feature.

Oauth class (/app/ThirdParty/Googleapi/Oauth.php):
Code:
<?php namespace ThirdParty\Googleapi;

class Oauth
{
    public function __construct()
    {

    }

    public function dance(){
        return "dance dance baby!";
    }
}

?>

Autoload.php:
Code:
$psr4 = [
       'Config'          => APPPATH . 'Config',
       APP_NAMESPACE     => APPPATH,                // For custom namespace
       'App'             => APPPATH,                // To ensure filters, etc still found,

       //'ThirdParty'      => APPPATH . 'ThirdParty'  // temporarily disable PSR to test classmap locating
        ];

    $classmap = [
       'Oauth'        => APPPATH . 'ThirdParty/Googleapi/Oauth.php'
    ];

BaseController.php
Code:
namespace App\Controllers;

use CodeIgniter\Controller;
//use ThirdParty\Googleapi\Oauth; // temporarily disable PSR to test classmap locating

class BaseController extends Controller
{

    protected $helpers = [];


    public function initController(\CodeIgniter\HTTP\RequestInterface $request, \CodeIgniter\HTTP\ResponseInterface $response, \Psr\Log\LoggerInterface $logger)
    {
        // Do Not Edit This Line
        parent::initController($request, $response, $logger);

        $this->googleapi = new Oauth();
    }

}


As this is written, I get `Error: Class 'App\Controllers\Oauth' not found` in BaseController when trying to instantiate the Oauth class. This tells me CI did not check the classmap and instead just looked for `Oauth` in the controller PSR namespace that was loaded.

Have I done something wrong or is this a bug?

Thanks!
Evan
Hey, you is able to understand how it work now? I have same issue!
(02-13-2020, 10:56 AM)ajmeireles Wrote: [ -> ]Hey, you is able to understand how it work now? I have same issue!
Nope, I'm still using namespaces.
Hi, we discussed this in Codeigniter's slack channel yesterday. And the solution to this are:

PHP Code:
<?php namespace App\Controllers;

use \
Oauth;
// or use Oauth

class Home extends BaseController
{
    public function 
index()
    {
        
$oauth = new Oauth();
        echo 
$oauth->dance();
    }


If you are just specifying new Oauth() till will look in a relative path e.g. App\Controllers, as you are trying to access it from there. If you want it to load the global Oauth you will need to use "use Oauth" before making the class.