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