robertkleinschuster / zenith
A Component App Framework for PHP
Requires
- php: ^8.2
- robertkleinschuster/compass: v0.0.1
- robertkleinschuster/mosaic: v0.0.1
- slim/psr7: ^1.6
- slim/slim: ^4.12
Requires (Dev)
- phpstan/phpstan: ^1.10.21
- phpunit/phpunit: ^10.4.1
README
Zenith is an advanced PHP application framework designed to streamline the development process by incorporating both the Slim Framework and Compass Router for a component-driven development experience inspired by NEXT.js routing.
Key Features
- Component-Driven Development: Utilizes a highly modular architecture allowing for reusable components.
- NEXT.js Inspired Routing: Offers an intuitive approach to routing in PHP, enhancing the navigational structure of your application.
- Slim Framework Base: Leverages the Slim Framework, providing a powerful and robust base for building applications.
- Advanced Rendering Techniques: Supports reactive and lazy page rendering to optimize user experiences.
Quick Start
Create and run your next PHP application in a few easy steps:
-
Project Setup:
Initialize a new project using Composer:
composer create-project robertkleinschuster/zenith-starter my-new-project
-
Development Server:
Launch the development server:
composer dev
Visit your application at https://localhost:8080/.
-
Add Routes:
Introduce new routes to your application easily:
composer add-route /about-me
Example: Access
route/about-me/page.php
via https://localhost:8080/about-me.
Directory Structure
Understand the architecture of your project:
components/ # Put functional components here
public/ # Webserver document root
routes/ # Route entrypoints
src/ # Object-oriented code for business logic
tests/ # Unit tests
Usage Example
This example demonstrates setting up a user profile page, focusing on automatic route registration, dynamic layouts, and handling form submissions according to the framework's conventions.
Convention Overview
page.php
files for GET requests andlayout.php
for layouts follow a specific naming and directory structure convention based on the route they serve.action.php
files, for POST requests, are placed alongsidepage.php
andlayout.php
files, adhering to the same path-related conventions.
Step 1: Profile Page and Layout
For the route /user/{userId}
, arrange the following structure inside the routes
directory:
-
Add
page.php
withinroutes/user/{userId}/
to render profile content:<?php use Mosaic\Fragment; use Psr\Http\Message\ServerRequestInterface; return function(ServerRequestInterface $request, array $params) { $userId = $params['userId']; $content = "<h1>User Profile for User ID: {$userId}</h1>"; return new Fragment($content); };
-
Create
layout.php
in the same directory (routes/user/{userId}/
) to establish the page layout:<?php use Mosaic\Fragment; use Mosaic\Renderer; return function(Renderer $renderer, $children) { $html = "<html><body>{$renderer->render($children)}</body></html>"; return new Fragment($html); };
Step 2: Form Submission Action
- Implement
action.php
withinroutes/user/{userId}/
for processing the form submission:<?php use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; return function(ServerRequestInterface $request, ResponseInterface $response) { $formData = $request->getParsedBody(); $response->getBody()->write("Form data: " + htmlspecialchars($formData['data'])); return $response; };