Call multiple application models from a shared site in a single installation of Codeigniter 4
P粉653045807
2023-08-31 22:44:08
<p>How to call models from other multi-application sites in a single installation of Codeigniter 4? </p>
<p>The folder structure looks like this: </p>
<pre class="brush:php;toolbar:false;">- WebsiteFolder
--Site1
---app
---public
--- tests
--- writeable
(.env, spark and other files)
--Site2
---app
---public
--- tests
--- writeable
(.env, spark and other files)
-- system</pre>
<p>Here is my sample code: </p>
<p><strong>At site 1</strong></p>
<hr />
<p><strong>Constants.php</strong>
I have defined a root directory to locate site2. </p>
<pre class="brush:php;toolbar:false;">define('ROOTSOURCE', dirname(__DIR__,3) . '\site2');</pre>
<p>This returns: </p>
<p><em>E:\Project\website\site2</em></p>
<p><strong>Autoload.php</strong></p>
<p>I have set up PSR4. </p>
<pre class="brush:php;toolbar:false;">public $psr4 = [
APP_NAMESPACE => APPPATH, // For custom app namespace
'Config' => APPPATH . 'Config',
'Source\Models' => ROOTSOURCE . '/app/Models/'
];</pre>
<p>Then I run the SPARK command: </p>
<pre class="brush:php;toolbar:false;">php spark namespaces</pre>
<p>and return</p>
<pre class="brush:php;toolbar:false;"> --------------- ------------------ -------------------------------------------------- --------------------- --------
| 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 |
--------------- ---------------------------------- -------------------------------------------------- ---- -------- </pre>
<p>Then find the namespace <strong>Source\Models</strong>. So far so good.</p>
<p>Controller=> <strong>Home.php</strong></p>
<pre class="brush:php;toolbar:false;">namespace App\Controllers;
use Source\Models;
class Home extends BaseController
{
public function index()
{
$setting = new \Source\Models\Setting();
return view('welcome_message');
}</pre>
<p>When I run the controller I get: </p>
<blockquote>
<p><strong>Class 'Source\Models\Setting' not found</strong></p>
</blockquote>
<p>Next step,</p>
<p><strong>At site 2</strong></p>
<p>I have the model<strong>Settings</strong> in the Site2 models folder. </p>
<p><strong>Note:</strong></p>
<p>Everything is working fine in Site 2. </p>
<p>My problem is that I get the error "Class <strong>"Source\Models\Setting"" not found"</strong>The correct settings for calling site 2 models in a single application installation of codeigniter 4 are What? . < /p>
<p><strong>Note: </strong>
This is a single installation of codeigniter 4 for both websites. I shared the system folder. </p>
You can access the model in a class by creating a new instance or using the model() helper function.
Examples like this
I found the problem. This is the correct way to do this.
Folder structure
Controller - Home.php
Autoload.php
Constants.php
DBSetting.php
Namespace Sharing\Model; Using CodeIgniter\Model;
Class DBSetting extended model{
}
We can also call the model in site 2. Just set the correct path in Autoload.php to reference the model in site 2.
Notice: If a model in site 2 contains another model or link, if we call from site 1, the codeigniter 4 system will read the link, model from site 1. So make sure to call the normal model in site 2. Or just create a shared model folder as above.