К основному содержанию
правило

php — правило для Cursor: что делает и как установить

Правило задаёт стиль и практики безопасного PHP-кода: PSR-12, строгие типы, PHP 8.4+, проверки API и тестирование.

Установить в Cursor · Вручную: положить файлы Все способы и платформы ↓
.cursor/rules/php.mdc
Открыть на GitHub

Что делает php

Правило направляет Cursor при работе с PHP-файлами. Оно требует PSR-12, четырёх пробелов, Unix LF, declare(strict_types=1);, типизации аргументов и возвращаемых значений. Также рекомендует constructor property promotion, match, ?? и атрибуты PHP вместо docblock-аннотаций.

В правилах есть требования к Composer autoloading, ORM-запросам, кэшу и строгим сравнениям. Отдельные разделы посвящены валидации входных данных, экранированию вывода, prepared statements, хешированию паролей через password_hash(), CSRF и обработке исключений.

Правило задаёт подход к REST API, PHPUnit, PHPStan или Psalm и проверкам в CI/CD. Оно ориентируется на PHP 8.4+, поэтому проект на более старой версии потребует отдельной проверки совместимости.

Какие задачи решает

  • оформить PHP-код по PSR-12
  • включить строгую типизацию в файлах
  • защитить запросы от SQL-инъекций
  • проверить входные данные и вывод
  • спланировать тесты PHPUnit и статический анализ

Примеры запросов агенту

  • Приведи этот PHP-файл к PSR-12 и добавь строгую типизацию.
  • Проверь обработку $_POST и $_GET, prepared statements и экранирование вывода.
  • Добавь PHPUnit-тесты и настрой проверки PHPStan для этого класса.

Как установить php

Вручную: положить файлы

.cursor/rules/php.mdc

Во frontmatter: description, globs, alwaysApply

По шагам, с командами для каждой платформы: Cursor rules: файлы .mdc, четыре режима и замена .cursorrules

Вопросы о php

Как установить php в Cursor?

Поместите файл правила по пути .cursor/rules/php.mdc в проекте.

Что делает правило php?

Оно задаёт Cursor рекомендации по стилю PHP, типизации, безопасности, API, обработке ошибок и тестированию.

Какая версия PHP нужна для этого правила?

Рекомендации рассчитаны на современный PHP 8.4+ и используют его возможности, включая union types, attributes и match.

Исходный текст

php.mdc · CC0-1.0
---
description: This guide provides definitive best practices for writing clean, secure, and maintainable PHP code, strictly adhering to PSR-12 and modern PHP 8.4+ features.
globs: **/*
---
# PHP Best Practices

This document outlines the definitive best practices for PHP development within our team. Adherence to these guidelines ensures consistency, maintainability, and security across all projects.

## Critical Guidelines:

### 1. Code Organization and Structure (PSR-12 & Strict Types)

Always adhere to PSR-12 for coding style. This includes indentation, brace placement, and line length. Crucially, enable strict typing in every PHP file.

*   **Indentation**: Use 4 spaces, never tabs.
*   **Line Endings**: Unix LF only.
*   **Closing Tag**: Omit `?>` from files containing only PHP code.
*   **File Header Order**:
    1.  `<?php`
    2.  File-level docblock (optional)
    3.  `declare(strict_types=1);`
    4.  `namespace` declaration
    5.  `use` statements (class, then function, then constant, grouped)
    6.  The rest of the code.

❌ BAD:
```php
<?php
namespace App\Service;
use App\Model\User;
declare(strict_types=1);

class UserService {
    public function getUser($id) { // Missing return type, no strict types at top
        return User::find($id);
    }
}
```

✅ GOOD:
```php
<?php

declare(strict_types=1);

namespace App\Service;

use App\Model\User;
use App\Repository\UserRepository;

class UserService
{
    public function __construct(private UserRepository $userRepository) {}

    public function getUser(int $id): ?User
    {
        return $this->userRepository->find($id);
    }
}
```

### 2. Common Patterns and Anti-patterns

*   **Type Hinting**: Always use scalar and return type declarations. Leverage PHP 8+ union types, intersection types, and `mixed`/`static`/`never` where appropriate.
*   **Constructor Property Promotion**: Use for concise dependency injection.
*   **Match Expression**: Prefer `match` over `switch` for cleaner, more expressive comparisons.
*   **Null Coalescing Operator (`??`)**: Use to simplify checks for `null` or unset variables.
*   **Attributes**: Prefer native PHP attributes (`#[Attribute]`) over docblock annotations for metadata.

❌ BAD:
```php
class LegacyProcessor {
    public function process($type, $data) {
        switch ($type) { // Old switch, no types
            case 'foo': return 'Foo ' . $data;
            case 'bar': return 'Bar ' . $data;
            default: return null;
        }
    }
}
```

✅ GOOD:
```php
<?php

declare(strict_types=1);

#[Attribute(Attribute::TARGET_CLASS)]
class MyServiceAttribute {}

#[MyServiceAttribute]
class ModernProcessor
{
    public function process(string $type, string $data): ?string
    {
        return match ($type) {
            'foo' => 'Foo ' . $data,
            'bar' => 'Bar ' . $data,
            default => null,
        };
    }

    public function getSetting(array $config): string
    {
        // Use null coalescing for default values
        return $config['setting'] ?? 'default_value';
    }
}
```

### 3. Performance Considerations

*   **Latest PHP Version**: Always use the current stable PHP version (8.4+).
*   **Composer Autoloading**: Optimize Composer's autoloader for production (`composer dump-autoload --optimize --no-dev --classmap-authoritative`).
*   **Avoid N+1 Queries**: Eager load relationships in ORMs.
*   **Caching**: Implement application-level caching for frequently accessed data.

### 4. Common Pitfalls and Gotchas

*   **Loose Comparisons**: Always use strict comparison operators (`===`, `!==`).
*   **Error Suppression**: Never use the `@` operator. Handle errors gracefully with exceptions.
*   **Modifying Arrays During Iteration**: Leads to unpredictable behavior. Iterate over a copy or use appropriate collection methods.

### 5. Security Best Practices

*   **Input Validation & Sanitization**: Validate all external input. Use specific validation rules, not just `filter_var`.
*   **Output Escaping**: Escape all output based on context (HTML, URL, JavaScript, CSS). Use templating engines that auto-escape or dedicated functions (e.g., `htmlspecialchars`).
*   **Prepared Statements**: Always use parameterized queries (PDO or ORM) to prevent SQL injection.
*   **Password Hashing**: Use `password_hash()` with `PASSWORD_ARGON2ID` (or `PASSWORD_BCRYPT` as fallback). Never store plain text passwords.
*   **Dependency Updates**: Regularly update Composer dependencies and run `composer audit`.
*   **CSRF Protection**: Implement CSRF tokens for state-changing requests.

❌ BAD:
```php
$username = $_POST['username'];
$password = $_POST['password'];
$sql = "SELECT * FROM users WHERE username = '$username' AND password = '$password'"; // SQL Injection!
$db->query($sql);
echo "Hello, " . $_GET['name']; // XSS vulnerability!
```

✅ GOOD:
```php
<?php

declare(strict_types=1);

// Input Validation
if (!isset($_POST['username']) || !is_string($_POST['username'])) {
    throw new InvalidArgumentException('Invalid username.');
}
$username = trim($_POST['username']);

// Password Hashing
$hashedPassword = password_hash($_POST['password'], PASSWORD_ARGON2ID);

// Prepared Statements
$stmt = $db->prepare("SELECT * FROM users WHERE username = :username AND password = :password");
$stmt->execute([':username' => $username, ':password' => $hashedPassword]);

// Output Escaping
echo "Hello, " . htmlspecialchars($_GET['name'] ?? 'Guest', ENT_QUOTES, 'UTF-8');
```

### 6. Error Handling

*   **Exceptions**: Use exceptions for all exceptional conditions. Create custom exception classes for domain-specific errors.
*   **Centralized Handling**: Implement a global exception handler to catch unhandled exceptions and log them.
*   **Logging**: Use a robust logging library (e.g., Monolog) for all errors, warnings, and important events.

### 7. API Design

*   **RESTful Principles**: Design APIs to be resource-oriented, using standard HTTP methods (GET, POST, PUT, DELETE) and status codes.
*   **Consistent Naming**: Use consistent pluralized resource names (e.g., `/users`, not `/user`).
*   **Versioning**: Implement API versioning (e.g., `/v1/users`).
*   **Payload Validation**: Strictly validate all incoming request payloads.

### 8. Testing Approaches

*   **PHPUnit**: Write comprehensive unit and integration tests using PHPUnit.
*   **Test Doubles**: Use mocks, stubs, and fakes to isolate units of code during testing.
*   **Static Analysis**: Integrate PHPStan or Psalm into your CI/CD pipeline with a high strictness level.
*   **Continuous Integration**: Automate tests and static analysis checks on every commit.

© sanjeed5 · CC0-1.0 · sanjeed5/awesome-cursor-rules-mdc

Похожие правила IDE

Все правила IDE по теме «Языки программирования» →
php-pro https://github.com/Jeffallan Задаёт правила разработки на PHP 8.3+ для Laravel и Symfony: включает strict_types, анализ в PHPStan на уровне 9 и тесты PHPUnit или Pest. CX Codex +1 15 500установок php-development Mindrally Скилл задаёт агенту правила написания PHP 8+ кода: SOLID, PSR-12, строгая типизация, тесты на PHPUnit. Пригодится, когда проект на PHP растёт и хочется единый стиль. CX Codex +1 1 100установок PHP MCP Expert официальный github Помогает разрабатывать серверы Model Context Protocol на PHP 8.2+ с официальным SDK от The PHP Foundation. Генерирует код инструментов и ресурсов через атрибуты. ★ 40 478звёзд репо spatie-laravel-php Spatie Настраивает правила кодинга Spatie и PSR-12 для задач по созданию, рефакторингу и ревью PHP-кода или шаблонов Blade в проектах на Laravel. CX Codex +1 1 200установок php-mcp-server-generator официальный github Генерирует PHP-проект MCP-сервера с инструментами, ресурсами, промптами и тестами. Подойдёт, когда нужно быстро собрать основу сервера под свои задачи. 8 900установок magento-code-reviewer maxnorm Проверяет PHP-код Magento 2 на соответствие PSR-12, стандартам Magento, безопасность и производительность. Пригодится перед коммитом или в пул-реквесте. CX Codex +1 475установок

Из того же набора240

Весь набор →
poetry Инструкция по настройке Poetry в Cursor. Задаёт правила оформления pyproject.toml, структуру каталогов и управление зависимостями в проектах на Python. ★ 3 580звёзд репо plotly Правило задаёт структуру кода для Plotly-графиков в Python: отделять подготовку данных от визуализации, оформлять фигуры и учитывать большие наборы данных. ★ 3 580звёзд репо playwright Правило задаёт Cursor стандарты написания end-to-end тестов на Playwright: официальный раннер, устойчивые локаторы, отказ от ручных задержек. ★ 3 580звёзд репо pillow Задаёт правила работы с библиотекой Pillow в файлах Python. Требует закрывать файлы через контекстные менеджеры и безопасно сохранять форматы изображений. ★ 3 580звёзд репо phoenix Правило для Cursor задаёт, как писать Phoenix-приложения на Elixir: контексты, форматирование, тесты. Пригодится, если агент уже правит ваш код. ★ 3 580звёзд репо peewee Задаёт стандарты работы с ORM Peewee в Python: настройку BaseModel, внешние ключи с backref, транзакции atomic и защиту от проблемы N+1. ★ 3 580звёзд репо pdoc Правило задаёт формат docstring и type hints в Python-коде, который документируется через pdoc. Пригодится, когда нужно привести описание публичного API к единому виду. ★ 3 580звёзд репо pandas Правило для Cursor задаёт стиль работы с pandas: векторизация вместо циклов, явные .loc и .iloc, экономные типы данных. Пригодится, если агент часто пишет медленный код. ★ 3 580звёзд репо

Спонсоры проекта

Компании, которые помогают держать аналитику открытой