Разработка PHP приложения: структура, инструменты, настройка

Раздел: Разработка на PHP -> Управление проектами PHP

Организация PHP проекта: от пустой папки до работающего приложения

Основной подход: использование Composer для управления зависимостями и автозагрузкой по стандарту PSR-4. Этот метод подходит для большинства современных PHP проектов, обеспечивая гибкость и поддержку сообщества.

Цель: создать структуру проекта, которая легко масштабируется, поддерживает автозагрузку классов и позволяет подключать сторонние библиотеки.

Пошаговая инструкция:

  1. Установите Composer глобально (см. официальную документацию).
  2. Создайте пустую директорию проекта и перейдите в неё.
  3. Выполните команду composer init и следуйте интерактивному мастеру. Для типового проекта укажите имя (например, myapp/project), описание, автора, а в качестве типа - project. Зависимости пока можно оставить пустыми.
  4. Отредактируйте файл composer.json, добавив секцию autoload для PSR-4:
{
  "name": "myapp/project",
  "description": "Пример PHP проекта",
  "autoload": {
    "psr-4": {
      "App\\": "src/"
    }
  },
  "require": {}
}

Php создаем проект (создание php проекта)

  1. Выполните composer dump-autoload для генерации автозагрузчика.
  2. Создайте директорию src и разместите в ней классы с пространством имён App.
  3. Создайте точку входа, например public/index.php, и подключите автозагрузчик:
<?php
require __DIR__ . '/../vendor/autoload.php';

use App\Models\User;

$user = new User();
echo $user->getName();

Типичные ошибки:

  • Composer не найден - проверьте установку и путь в переменной окружения PATH.
  • Автозагрузка не работает - убедитесь, что пространство имён в composer.json совпадает с реальной структурой папок (регистр символов).
  • Ошибка доступа к vendor - после composer install проверьте права на папку vendor.

Случаи использования: новые проекты, микросервисы, API, веб-приложения. Подходит для командной работы через Git (vendor добавляется в .gitignore).

Как создать PHP проект без использования Composer?

Этот вариант актуален для учебных целей, legacy-проектов или окружений без доступа к интернету. Вся автозагрузка выполняется вручную.

Структура:

project/
├── classes/
│   └── Utils/Database.php
├── index.php
└── autoload.php

Пример autoload.php:

<?php
spl_autoload_register(function ($class) {
    $prefix = 'App\\';
    $base_dir = __DIR__ . '/classes/';
    $len = strlen($prefix);
    if (strncmp($prefix, $class, $len) !== 0) return;
    $relative_class = substr($class, $len);
    $file = $base_dir . str_replace('\\', '/', $relative_class) . '.php';
    if (file_exists($file)) require $file;
});

Проблемы: ручная настройка автозагрузчика, отсутствие менеджера зависимостей, сложность подключения сторонних библиотек.

Цель: понять механизм автозагрузки или работа в ограниченной среде.

Как ускорить создание проекта на Laravel?

Использование Laravel Installer - команда composer global require laravel/installer, затем laravel new myproject.

composer global require laravel/installer
laravel new blog

Создаётся готовая структура с настройками, миграциями, шаблонами Blade и т.д.

Ошибки: если глобальный пакет не найден, проверьте, что папка ~/.composer/vendor/bin добавлена в PATH.

Цель: быстрое прототипирование на Laravel, стандартная структура, автоматическая настройка базы данных.

Как создать PHP проект с Docker для изоляции окружения?

Два основных файла: Dockerfile и docker-compose.yml.

Dockerfile (для PHP-FPM):

FROM php:8.2-fpm
RUN docker-php-ext-install pdo_mysql
WORKDIR /var/www/html
COPY . .

docker-compose.yml:

version: '3.8'
services:
  app:
    build: .
    volumes:
      - .:/var/www/html
    ports:
      - "9000:9000"

Проблема: неправильная публикация портов, несоответствие версий PHP. Решение - всегда указывать конкретную версию образа.

Цель: унификация окружения разработки, тестирования и продакшена.

Как создать проект на Symfony с помощью CLI?

Используется команда symfony new myproject --full для полного приложения или --webapp для веб-приложения.

symfony new my_project_directory --full

Это создаёт структуру с использованием Flex и готовой конфигурацией.

Ошибка: если не установлен Symfony CLI, скачайте его с официального сайта.

Цель: быстрый старт с современным фреймворком, встроенная автозагрузка и поддержка best practices.

Расширенные примеры и сценарии использования

Создание собственного автозагрузчика с регистрацией

Если стандартный composer dump-autoload не подходит, можно реализовать автозагрузку через spl_autoload_register с дополнительной логикой.

Пример
<?php
// src/Loader.php
namespace App\Core;

class Loader
{
    public static function register()
    {
        spl_autoload_register(function ($class) {
            $prefix = 'App\\';
            $baseDir = __DIR__ . '/../../src/';
            $len = strlen($prefix);
            if (strncmp($prefix, $class, $len) !== 0) {
                return;
            }
            $relativeClass = substr($class, $len);
            $file = $baseDir . str_replace('\\', '/', $relativeClass) . '.php';
            if (file_exists($file)) {
                require $file;
            } else {
                throw new \RuntimeException("Class $class not found in $file");
            }
        });
    }
}

// index.php
require 'src/Core/Loader.php';
\App\Core\Loader::register();
\App\Models\User::greet();

Результат: при обращении к любому классу из пространства имён App будет подключаться соответствующий файл. Ошибка генерируется при отсутствии файла.

Привет от User!

Автоматизация через Composer scripts

В секцию scripts файла composer.json можно добавить команды, выполняемые при определённых событиях. Например, очистка кэша после обновления зависимостей.

Пример
{
  "scripts": {
    "post-update-cmd": [
      "@clear-cache"
    ],
    "pre-install-cmd": [
      "echo 'Начало установки зависимостей'"
    ],
    "clear-cache": "rm -rf var/cache/*"
  }
}

Результат: после выполнения composer update автоматически очистится папка var/cache. Команды можно задавать как строку, так и массив.

Настройка файла .env с библиотекой phpdotenv

Библиотека vlucas/phpdotenv позволяет загружать переменные окружения из файла .env в массив $_ENV или getenv().

Пример
composer require vlucas/phpdotenv

Создайте .env:

Пример
DB_HOST=127.0.0.1
DB_NAME=test
DB_USER=root
DB_PASS=secret

Загрузите в точке входа:

Пример
<?php
require 'vendor/autoload.php';

$dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
$dotenv->load();

echo 'Подключение к ' . $_ENV['DB_HOST'] . '...';

Результат: в выводе появится Подключение к 127.0.0.1.... Если файл .env отсутствует, будет выброшено исключение (Dotenv\Exception\InvalidPathException).

Makefile для типичных задач

Утилита make помогает стандартизировать команды разработки. Пример Makefile для PHP проекта:

Пример
.PHONY: install test clean

install:
	composer install --no-dev --optimize-autoloader

test:
	php vendor/bin/phpunit --testdox

clean:
	rm -rf vendor composer.lock .env

serve:
	php -S localhost:8000 -t public

Теперь можно выполнять make install, make test и т.д. Результат: минимализация ручного ввода команд и снижение вероятности ошибок.

Интеграция PHPUnit с автозагрузкой проекта

Добавьте PHPUnit через Composer в раздел require-dev:

Пример
composer require --dev phpunit/phpunit

Конфигурация phpunit.xml:

Пример
<?xml version="1.0" encoding="UTF-8"?>
<phpunit bootstrap="vendor/autoload.php">
    <testsuites>
        <testsuite name="Unit">
            <directory>tests/Unit</directory>
        </testsuite>
    </testsuites>
</phpunit>

Пример теста tests/Unit/UserTest.php:

Пример
<?php
use PHPUnit\Framework\TestCase;
use App\Models\User;

class UserTest extends TestCase
{
    public function testGreet()
    {
        $user = new User();
        $this->assertEquals('Hello', $user->greet());
    }
}

Результат: запуск vendor/bin/phpunit выведет отчёт о прохождении тестов, основанный на автозагрузке Composer.

PHPUnit 10.x.y
✓ User → testGreet
Time: 0.01 seconds, Memory: 4.00 MB
OK (1 test, 1 assertion)

Создание PHP проекта - comments

En
Php создаем проект (php)