Add Component Structure and MVC Implementation

Llewellyn
2025-03-26 08:11:10 +00:00
parent 7e7637dd98
commit 8db9cf5296

@ -0,0 +1,86 @@
## Overview
Joomla 5 follows the **Model-View-Controller (MVC)** design pattern, which separates data processing (Model), presentation (View), and user interaction (Controller). This separation enhances modularity, making it easier to extend and maintain components without affecting other sections.
Joomlas autoloading system allows developers to structure controllers, views, and models in separate files without manually including them. However, proper **naming conventions** must be followed to ensure smooth loading and execution.
## MVC Structure in Joomla 5
### **File and Naming Conventions**
Joomla uses **{ComponentName}** as the standard reference for a component (e.g., `Content`). Case sensitivity is important:
- `{ComponentName}` → CamelCase format
- `{componentname}` → Lowercase format
- `{ViewName}` → View name in CamelCase
- `{viewname}` → Lowercase view name
- `{ModelName}` → Model name in CamelCase
- `{modelname}` → Lowercase model name
- `{ControllerName}` → Controller name in CamelCase
- `{controllername}` → Lowercase controller name
### **Reserved Words**
Certain words cannot be used as part of class or component names. For example:
- The word **"model"** can only appear as the second part of a model class name (e.g., `ContentModelArticles`).
- Component names cannot contain "Model," as controllers inherit naming conventions from models.
## **Installation Package and File Placement**
All Joomla extensions must be packaged as a `.zip` file and contain at least the following directories:
```
com_{componentname}/
├── site/
└── admin/
```
- **`site/`**: Holds frontend files.
- **`admin/`**: Holds backend (administrator) files.
When installed:
- `site/` is placed under `/components/com_{componentname}`
- `admin/` is placed under `/administrator/components/com_{componentname}`
## **Frontend (`/site`) Component Structure**
### **Main Entry Point**
- **`site/{componentname}.php`** → The components main entry file.
### **Controller**
- **`site/controller.php`** → Default controller.
- Defines `{ComponentName}Controller`, extending `\Joomla\CMS\MVC\Controller\BaseController`.
- Additional controllers go under `site/controllers/{controllername}.php`.
### **Views**
- **`site/views/{viewname}/view.html.php`** → Main view file.
- Declares `{ComponentName}View{ViewName}` extending `\Joomla\CMS\MVC\View\HtmlView`.
- Templates for the view reside in:
```
site/views/{viewname}/tmpl/
├── default.php (Main template file)
```
### **Models**
- **`site/models/{modelname}.php`** → Model class.
- Declares `{ComponentName}Model{ModelName}` extending `\Joomla\CMS\MVC\Model\BaseDatabaseModel`.
- By default, a view loads a model with the same name (if it exists).
## **Backend (`/admin`) Component Structure**
The `/admin` directory follows the same structure as `/site`, but it is entirely separate.
Key points:
- **Admin and site components are distinct**; sharing code is optional.
- **Shared models** can reduce code duplication.
- To avoid security risks, ensure site users cannot execute admin actions.
### **Code Sharing Between Site and Admin**
Joomla supports shared models and utility classes between frontend and backend. When sharing code:
- Place shared classes in a neutral directory (`/models`, `/helpers`).
- Ensure class design prevents unauthorized access to admin functionalities.
## **Naming Validation in Joomla Core**
Joomla enforces naming rules via the `getName()` function in:
**`libraries/src/MVC/Model/BaseDatabaseModel.php`**:
```php
if (!preg_match('/Model(.*)/i', get_class($this), $r)) {
throw new RuntimeException("Invalid model class name");
}
```
This ensures proper MVC structure is maintained in Joomla 5.
## **Conclusion**
By adhering to Joomlas MVC architecture and naming conventions, developers can build maintainable, extensible, and well-structured components. Keeping site and admin logic modular improves reusability and security within the Joomla ecosystem.