Search code examples
phpcodeignitercodeigniter-4

Mutli Application Calling Model From Shared Site In Single Installation Codeigniter 4


How to call models from other multi application site in single installation codeigniter 4 ?

The folder structure look like this :

- WebsiteFolder
  -- Site1
     --- app
     --- public
     --- tests
     --- writeable
     (.env, spark and other file)
  -- Site2
     --- app
     --- public
     --- tests
     --- writeable
     (.env, spark and other file)
  -- system

This is my example code :

In Site1


Constants.php I have define a root directory to targeted the site2.

define('ROOTSOURCE', dirname(__DIR__,3) . '\site2');

This return :

E:\Project\website\site2

Autoload.php

I have setup PSR4.

 public $psr4 = [
        APP_NAMESPACE => APPPATH, // For custom app namespace
        'Config'      => APPPATH . 'Config',        
        'Source\Models' => ROOTSOURCE . '/app/Models/'
    ];

Then I Run SPARK COMMAND :

php spark namespaces

And return

+---------------+-----------------------------------------------------------------------------------------+--------+
| Namespace     | Path                                                                                    | Found? |
+---------------+-----------------------------------------------------------------------------------------+--------+
| CodeIgniter   | E:\Project\DennisLiu\website\system                                         | Yes    |
| App           | E:\Project\DennisLiu\website\site1\app        | Yes    |
| Config        | E:\Project\DennisLiu\website\site1\app\Config | Yes    |
| Source\Models | E:\Project\DennisLiu\website\site2\app\Models           | Yes    |
+---------------+-----------------------------------------------------------------------------------------+--------+

Then NameSpace Source\Models is Found. So far everything is okay.

Controller => Home.php

namespace App\Controllers;
use Source\Models;


class Home extends BaseController
{
    public function index()
    {                
        
        $setting = new \Source\Models\Setting();                                                    

        return view('welcome_message');
        
    }

When I run the controller I got :

Class "Source\Models\Setting" not found

Next,

In Site2

I have model "Setting" in Site2 Model Folder.

For Note :

Everything In Site 2 Is running properly.

My question is for the error I got "Class "Source\Models\Setting" not found" What is the proper setting to call the site 2 model in single application installation codeigniter 4 ?.

For Note : This is single installation codeigniter 4 for two website. And I shared the system folder.


Solution

  • I found the problem. This is the correct way to do this.

    Folder Structure

    - WebsiteFolder
      -- Site1
         --- app
         --- public
         --- tests
         --- writeable
         (.env, spark and other file)
      -- Site2
         --- app
         --- public
         --- tests
         --- writeable
         (.env, spark and other file)
      -- shared/Models
         (DBSetting.php)
      -- system
    

    Controller - Home.php

    namespace App\Controllers;
    use shared\Models\DBSetting;
    
    
    
    class Home extends BaseController
    {
        public function index()
        {                
            
            $db = new \shared\Models\DBSetting();                
    
            return view('welcome_message');
            
        }
    }
    

    Autoload.php

     public $psr4 = [
            APP_NAMESPACE   => APPPATH, // For custom app namespace
            'Config'        => APPPATH . 'Config',               
            'shared\Models' => ROOTSOURCE . '/shared/Models'        
        ];
    

    Constants.php

    define('ROOTSOURCE', dirname(__DIR__,3));
    

    DBSetting.php

    namespace shared\Models; use CodeIgniter\Model;

    class DBSetting extends Model {

    function __construct()
    {       
        parent::__construct();                  
    }
    
    
    public function save() {    
        return true;
    }   
    

    }

    We can also call the model in site 2. Just set the correct path in Autoload.php to refer to models in site 2.

    Note : If the model in site 2 content another model or link, if we call from the site 1 then codeigniter 4 system will read the link, model from site 1. So make sure to call the plain model in site 2. Or just create a share model folder like above.