Skip to content

Bug: [Factories] preferApp does not work for classes with the same short name #7699

@kenjis

Description

@kenjis

Related: #7694

When we load a class in non-App namespace ('Acme\Blog\Models\UserModel') with 'preferApp' => false,
and load a class which has the same short name ('UserModel' or 'App\Models\UserModel') with 'preferApp' => true,
the instance in non-App namespace will be returned.

preferApp | boolean | Whether a class with the same basename in the App namespace overrides other explicit class requests.
https://codeigniter4.github.io/CodeIgniter4/concepts/factories.html#factories-options

Steps to Reproduce

--- a/app/Config/Autoload.php
+++ b/app/Config/Autoload.php
@@ -42,6 +42,7 @@ class Autoload extends AutoloadConfig
     public $psr4 = [
         APP_NAMESPACE => APPPATH, // For custom app namespace
         'Config'      => APPPATH . 'Config',
+        'Acme\Blog'   => ROOTPATH . 'acme/Blog',
     ];
 
     /**
<?php

namespace App\Models;

use CodeIgniter\Model;

class UserModel extends Model
{
    protected $table = 'users';
}
<?php

namespace Acme\Blog\Models;

class UserModel
{
}
<?php

namespace App\Controllers;

use CodeIgniter\Config\Factories;

class Home extends BaseController
{
    public function index()
    {
        $users1 = Factories::models('Acme\Blog\Models\UserModel', ['preferApp' => false]);
        $users2 = Factories::models('UserModel', ['preferApp' => true]);

        return get_class($users1) . ', ' . get_class($users2);
    }
}

Results:

Acme\Blog\Models\UserModel, Acme\Blog\Models\UserModel

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions