PHP code example of neuron-php / mvc

1. Go to this page and download the library: Download neuron-php/mvc library. Choose the download type require.

2. Extract the ZIP file and open the index.php.

3. Add this code to the index.php.
    
        
<?php
require_once('vendor/autoload.php');

/* Start to develop here. Best regards https://php-download.com/ */

    

neuron-php / mvc example snippets



ootstrap the application
$app = boot('../config');

// Dispatch the current request
dispatch($app);

namespace App\Controllers;

use Neuron\Mvc\Controllers\Base;
use Neuron\Mvc\Responses\HttpResponseStatus;

class HomeController extends Base
{
    public function index(): string
    {
        return $this->renderHtml(
            HttpResponseStatus::OK,
            ['title' => 'Welcome'],
            'index',  // view file
            'default' // layout file
        );
    }
}

// resources/views/home/index.php
<h1> echo $title; 

// resources/views/layouts/default.php
<!DOCTYPE html>
<html>
<head>
    <title> echo $title ?? 'My App'; 

use Neuron\Routing\Attributes\Get;
use Neuron\Routing\Attributes\Post;
use Neuron\Routing\Attributes\RouteGroup;

#[RouteGroup(prefix: '/api', filters: ['auth'])]
class UserController extends Base
{
    #[Get('/user/:id', name: 'user_profile')]
    public function profile(Request $request): string
    {
        $userId = $request->getRouteParameter('id');
        // ...
    }

    #[Post('/users', name: 'api_users', filters: ['csrf'])]
    public function create(Request $request): string
    {
        // ...
    }
}

public function profile(Request $request): string
{
    $dto = $request->getDto();
    $userId = $dto->id;
    // ...
}

class UserController extends Base
{
    public function show($id): string
    {
        $user = User::find($id);
        
        // Magic methods for URL generation
        $editUrl = $this->userEditPath(['id' => $id]);
        $absoluteUrl = $this->userProfileUrl(['id' => $id]);
        
        // Use in redirects
        if (!$user) {
            return redirect($this->userIndexPath());
        }
        
        return $this->renderHtml(HttpResponseStatus::OK, [
            'user' => $user,
            'edit_url' => $editUrl
        ]);
    }
    
    public function create(): string
    {
        // After creating user, redirect using magic method
        $user = new User($request->all());
        $user->save();
        
        return redirect($this->userProfilePath(['id' => $user->id]));
    }
}

// Generate relative URLs
$profileUrl = $this->urlFor('user_profile', ['id' => 123]);

// Generate absolute URLs  
$absoluteUrl = $this->urlForAbsolute('user_profile', ['id' => 123]);

// Check if route exists
if ($this->routeExists('user_profile')) {
    // Route is available
}

// Get UrlHelper instance for advanced usage
$urlHelper = $this->urlHelper();

<!-- resources/views/user/profile.php -->
<div class="user-profile">
    <h1><?= $user->name 

// Returns null if route doesn't exist
$url = $urlHelper->nonExistentRoutePath(['id' => 123]);

if ($url === null) {
    // Handle missing route
    $url = $urlHelper->userIndexPath(); // fallback
}

// Get all available routes for debugging
$routes = $urlHelper->getAvailableRoutes();
foreach ($routes as $route) {
    echo "Route: {$route['name']} -> {$route['method']} {$route['path']}\n";
}

// Custom UrlHelper instance
$customHelper = new UrlHelper($customRouter);

namespace App\Controllers;

use Neuron\Mvc\Controllers\Base;
use Neuron\Mvc\Requests\Request;
use Neuron\Mvc\Responses\HttpResponseStatus;

class ProductController extends Base
{
    public function list(): string
    {
        $products = $this->getProducts();
        
        return $this->renderHtml(
            HttpResponseStatus::OK,
            ['products' => $products],
            'list',
            'default'
        );
    }
    
    public function apiList(): string
    {
        $products = $this->getProducts();
        
        return $this->renderJson(
            HttpResponseStatus::OK,
            ['products' => $products]
        );
    }
    
    public function details(Request $request): string
    {
        $id = $request->getRouteParameter('id');
        $product = $this->getProduct($id);
        
        if (!$product) {
            return $this->renderHtml(
                HttpResponseStatus::NOT_FOUND,
                ['message' => 'Product not found'],
                'error',
                'default'
            );
        }
        
        return $this->renderHtml(
            HttpResponseStatus::OK,
            ['product' => $product],
            'details',
            'default'
        );
    }
}

// Custom 404 handler
class NotFoundController extends HttpCodes
{
    public function render404(): string
    {
        return $this->renderHtml(
            HttpResponseStatus::NOT_FOUND,
            ['message' => 'Page not found'],
            '404',
            'error'
        );
    }
}

// Cache is automatically used when enabled
$html = $this->renderHtml(
    HttpResponseStatus::OK,
    $data,
    'cached-view',
    'layout'
);

// Clear all expired cache entries (file storage only)
$removed = ClearExpiredCache($app);
echo "Removed $removed expired cache entries";

// Clear all cache
$app->getViewCache()->clear();

use Neuron\Mvc\Cache\Storage\CacheStorageFactory;

// Create storage based on configuration
$storage = CacheStorageFactory::create([
    'storage' => 'redis',
    'redis_host' => 'localhost',
    'redis_port' => 6379,
    'redis_database' => 0,
    'redis_prefix' => 'neuron_cache_'
]);

// Auto-detect best available storage
$storage = CacheStorageFactory::createAutoDetect();

// Check storage availability
if (CacheStorageFactory::isAvailable('redis')) {
    echo "Redis cache is available";
}

namespace App\Views;

use Neuron\Mvc\Views\IView;

class PdfView implements IView
{
    public function render(array $Data): string
    {
        // Generate PDF content
        return $pdfContent;
    }
}

use Neuron\Routing\Attributes\Get;

class HomeController extends Base
{
    // Public page - no rate limiting
    #[Get('/', name: 'home')]
    public function index(Request $request): string
    {
        // ...
    }
}

class UserController extends Base
{
    // Standard protected route with rate limiting
    #[Get('/user/profile', name: 'user_profile', filters: ['rate_limit'])]
    public function profile(Request $request): string
    {
        // Apply rate_limit (100/hour)
        // ...
    }
}

class ApiController extends Base
{
    // API endpoint with higher limits
    #[Get('/api/users', name: 'api_users', filters: ['api_limit'])]
    public function users(Request $request): string
    {
        // Apply api_limit (1000/hour)
        // ...
    }
}

use Neuron\Routing\Attributes\Post;
use Neuron\Routing\Attributes\Get;

class AuthController extends Base
{
    #[Post('/auth/login', name: 'login', filters: ['rate_limit'])]
    public function login(Request $request): string
    {
        // Strict limit for login attempts
        // ...
    }
}

class ApiController extends Base
{
    #[Get('/api/data', name: 'api_data', filters: ['api_limit'])]
    public function getData(Request $request): string
    {
        // Higher limit for API access
        // ...
    }
}

$app = Boot('/path/to/config');

Dispatch($app);

$removed = ClearExpiredCache($app);
bash
composer 
nginx
location / {
    try_files $uri $uri/ /index.php?route=$uri&$args;
}
yaml
api_limit:
  enabled: false
  storage: file
  requests: 1000         # 1000 requests per hour
  window: 3600
  file_path: cache/api_limits
yaml
rate_limit:
  enabled: true
  global: true
  requests: 100
  window: 3600
yaml
rate_limit:
  storage: memory
yaml
rate_limit:
  enabled: true
  global: false
  storage: redis
  requests: 100
  window: 3600
  redis_host: 127.0.0.1

api_limit:
  enabled: true
  storage: redis
  requests: 1000
  window: 3600
  redis_host: 127.0.0.1