In an Elixir Phoenix application that uses LiveView and follows the Umbrella Project structure, you often have two separate apps:
-
lib/betting_system/
(Core Logic - Contexts) -
lib/betting_system_web/
(Web Interface - Web Layer)
🔍 lib/betting_system/
(Core Logic)
This directory is where you define your domain logic and business rules. It typically contains:
- Contexts: Modules that interact with your database and handle business operations.
-
Schemas: Database schemas that define your data structure (like
Ecto.Schema
modules). - Services: Any core services not related to web delivery.
- Business Logic: Everything not tied to the web layer directly.
Example structure:
lib/betting_system/
├── betting_system.ex # Entry point defining your application supervision tree
├── accounts # Example context (User management, authentication, etc.)
│ ├── accounts.ex
│ └── user.ex
├── betting # Another context (Managing bets, games, etc.)
│ ├── betting.ex
│ └── game.ex
└── repo.ex # Ecto Repo definition for database interactions
🔍 lib/betting_system_web/
(Web Interface)
This directory is where your web-related code lives. It handles HTTP requests, LiveView rendering, controllers, views, and templates. It includes:
- LiveView Modules: Components that handle live, real-time user interfaces.
- Controllers: Handle incoming requests and map them to the appropriate contexts.
- Views & Templates: Render HTML pages.
- Routing: Defines how requests are mapped to controllers or LiveView modules.
Example structure:
lib/betting_system_web/
├── betting_system_web.ex # Web interface entry point
├── controllers # Standard Phoenix controllers
│ ├── page_controller.ex
│ └── user_controller.ex
├── live # LiveView modules
│ ├── user_live.ex
│ └── betting_live.ex
├── templates # HTML templates
│ ├── layout.html.heex
│ └── user
├── router.ex # Routes for HTTP and LiveView requests
└── endpoint.ex # Configures and starts the web interface
✅ Key Differences
Aspect | lib/betting_system/ |
lib/betting_system_web/ |
---|---|---|
Purpose | Business Logic (Core) | User Interface (Web Layer) |
Contains | Contexts, Schemas, Services | Controllers, LiveViews, Templates |
Data Handling | Defines schemas, interacts with DB | Displays data to users (HTML, LiveView) |
Dependencies | Pure Elixir (No Phoenix dependency) | Phoenix (Controllers, LiveView) |
Reusability | Can be reused without Phoenix | Tied to Phoenix Framework |
📌 Why This Separation?
- Separation of Concerns: Keeps business logic separate from presentation logic.
- Testability: Easier to test core logic without involving web interface.
-
Reusability: The core logic (
lib/betting_system/
) can be used independently of the web interface.