Skip to content

sedalit/simple-mvc-framework

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Simple MVC Framework

PHP Version License Packagist Downloads

Легковесный PHP MVC фреймворк для быстрой разработки веб-приложений, который был создан в учебно-познавательных целях. Создан с акцентом на простоту, производительность и современные практики разработки.

🚀 Особенности

  • MVC Architecture - Чистая архитектура Model-View-Controller
  • Роутинг - Гибкая система маршрутизации с поддержкой параметров и групп
  • Middleware - Встроенная поддержка middleware (Auth, Guest, CSRF)
  • Валидация - Расширяемая система валидации форм
  • Database - PDO wrapper с query builder
  • View Engine - Простой и быстрый шаблонизатор
  • Session Management - Управление сессиями и flash-сообщениями
  • Cache - Файловая система кеширования
  • Mail Service - Отправка email через PHPMailer
  • CSRF Protection - Встроенная защита от CSRF атак
  • Service Container - Dependency Injection контейнер
  • Environment Variables - Поддержка .env файлов
  • Pagination - Готовая система пагинации
  • File Upload - Удобная работа с загрузкой файлов

📋 Требования

  • PHP >= 8.0
  • PDO Extension
  • Composer
  • Apache/Nginx с mod_rewrite

🚀 Установка

Создайте новый проект

composer create-project sedalit/simple-php-framework-skeleton my-app
cd my-app

Настройте .env

cp .env.example .env
# Edit .env with your database credentials

Запустите dev-сервер

php -S localhost:8000 -t public

Откройте http://localhost:8000 в браузере.

📖 Документация

Маршруты

Определите маршруты в config/routes.php:

use App\Controllers\PostController;

// Базовые маршруты
$app->router()->get('/', [IndexController::class, 'index']);
$app->router()->post('/posts', [PostController::class, 'store']);

// Маршрут с динамическими параметрами
$app->router()->get('/posts/(?<id>\d+)', [PostController::class, 'show']);

// Маршрут с middleware
$app->router()->get('/dashboard', [DashboardController::class, 'index'], [
    AuthMiddleware::class
]);

// Группа маршрутов
$app->router()->group('/admin', [
    $app->router()->get('/users', [AdminController::class, 'users']),
    $app->router()->get('/settings', [AdminController::class, 'settings']),
])->middleware([AuthMiddleware::class]);

Контроллеры

namespace App\Controllers;

class PostController extends BaseController 
{
    public function index(): mixed
    {
        $posts = db()->findAll('posts');
        
        return $this->render('posts/index', ['posts' => $posts]);
    }
    
    public function show(): mixed
    {
        $id = router()->routeParam('id');
        $post = db()->findOrFail('posts', $id);
        
        return $this->render('posts/show', ['post' => $post]);
    }
}

Модели

namespace App\Models;

use PHPFramework\Model;

class Post extends Model 
{
    protected array $fillable = ['title', 'content', 'user_id'];
    
    protected function tableName(): string 
    {
        return 'posts';
    }
    
    protected function primaryKeyName(): string 
    {
        return 'id';
    }
}

// Использование
$post = new Post();
$post->title = 'My Post';
$post->content = 'Content here';
$id = $post->save();

$post->update();
$post->delete($id);

Валидация

$data = request()->post();

$rules = [
    'email' => 'required|email',
    'password' => 'required|min:8',
    'password_confirm' => 'required|match:password',
    'username' => 'required|min:3|max:20|unique:users',
    'avatar' => 'file|extension:jpg,png|fileSize:2MB'
];

if (!validate($data, $rules)) {
    $errors = validator()->errors();
    return $this->render('form', ['errors' => $errors]);
}

Представления

// В контроллере
return $this->render('posts/index', [
    'title' => 'All Posts',
    'posts' => $posts
]);

// В представлении (app/Views/posts/index.php)
<h1><?= h($title) ?></h1>

<?php foreach($posts as $post): ?>
    <article>
        <h2><?= h($post['title']) ?></h2>
        <p><?= h($post['content']) ?></p>
    </article>
<?php endforeach; ?>

Middleware

namespace App\Middlewares;

use PHPFramework\Interfaces\MiddlewareInterface;
use PHPFramework\Request;
use PHPFramework\Response;

class AdminMiddleware implements MiddlewareInterface 
{
    public function handle(Request $request, Response $response, callable $next): mixed
    {
        if (!isAdmin()) {
            abort('Access denied', 403);
        }
        
        return $next();
    }
}

Сессии

// Установка значение
session()->set('user_id', 123);

// Получение значения
$userId = session()->get('user_id');

// Flash-сообщения
session()->setFlash('success', 'Post created!');
$message = session()->getFlash('success');

// Проверка наличия
if (session()->has('user_id')) {
    // User is logged in
}

Кэш

// Сохранить в кэш со сроком жизни в 1 час
cache()->set('popular_posts', $posts, 3600);

// Получить из кэша
$posts = cache()->get('popular_posts', []);

// Удалить из кэша
cache()->forget('popular_posts');

Почта

use PHPFramework\Services\Mail\Mail;

$mail = new Mail(
    from: 'noreply@example.com',
    subject: 'Welcome!',
    body: 'Welcome to our platform',
    to: ['user@example.com']
);

App::mailer()->send($mail);

🎨 CLI команды

# Генерация файлов
php bin/console make:controller PostController
php bin/console make:model Post
php bin/console make:middleware AdminMiddleware
php bin/console make:rule PhoneRule

# Управление приложением
php bin/console cache:clear
php bin/console app:setup

# Помощь
php bin/console help

🔧 Функции-хэлперы

// Приложение
app() // Экземпляр Application

// View
view('template', $data, $layout) // Рендеринг view

// Request/Response
request() // Объект Request
response() // Объект Response
redirect('/path') // Редирект

// Валидация
validator() // Объект Validator
validate($data, $rules) // Быстрая валидация

// База данных
db() // Объект Database

// Сессия
session() // Объект Session
checkAuth() // Проверка авторизации

// Кэш
cache() // Объект Cache

// URL
baseUrl('/path') // Базовый URL приложения

// Безопасность
h($string) // htmlspecialchars
csrf() // CSRF token input

// Environment
env('KEY', 'default') // Получить переменную окружения

// Прочее
abort($message, $code) // Прервать выполнение с ошибкой
old('field') // Старое значение поля
formErrors('field', $errors) // Вывод ошибок валидации

📚 Правила валидации

  • required - Field is required
  • email - Valid email address
  • min:n - Minimum length
  • max:n - Maximum length
  • match:field - Match another field
  • unique:table - Unique in database table
  • file - File uploaded successfully
  • fileSize:size - File size limit (e.g., 2MB)
  • extension:ext1,ext2 - Allowed file extensions

🏗️ Структура

Framework Structure (vendor/sedalit/simple-mvc-framework/src/)
├── Application.php          # Application core
├── Router.php              # Route dispatcher
├── Database.php            # Database wrapper
├── QueryBuilder.php        # Fluent query builder
├── Controller.php          # Base controller
├── Model.php              # Base model with ActiveRecord
├── View.php               # View renderer
├── Request.php            # HTTP request
├── Response.php           # HTTP response
├── Session.php            # Session management
├── Cache.php              # File cache
├── Pagination.php         # Pagination logic
├── ServiceContainer.php   # DI container
├── Interfaces/            # Interfaces
├── Middlewares/           # Built-in middleware
├── Routing/              # Routing components
├── Security/             # Security features
├── Services/             # Framework services
├── Utils/                # Utility classes
├── Validation/           # Validation system
└── helpers.php           # Helper functions

🧪 Тестирование

composer test

🤝 Вклад в разработку

Contributions, issues и feature requests приветствуются!

  1. Fork проекта
  2. Создайте feature branch (git checkout -b feature/AmazingFeature)
  3. Commit изменения (git commit -m 'Add some AmazingFeature')
  4. Push в branch (git push origin feature/AmazingFeature)
  5. Откройте Pull Request

👤 Автор

Vladislav Agarkov

🌟 Поддержка проекта

Если проект оказался полезным, поставьте ⭐️!

📖 Связанные проекты

About

Кастомный PHP MVC фреймворк

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages