Коротко: автозагрузка через Composer — это PSR-4-маппинг в composer.json и команда dump-autoload; подключаете vendor/autoload.php и классы грузятся сами.

Автозагрузка классов через Composer — это PSR-4-маппинг неймспейса на каталог в composer.json плюс команда composer dump-autoload, которая генерирует автолоадер. Подключив vendor/autoload.php, вы получаете автоматическую загрузку классов по namespace. Разберём на примере простого блога в архитектуре MVC.

В прошлой статье мы рассмотрели нативный способ реализации автолоадера по PSR-4 через closure.

В этой статье мы рассмотрим как сделать автолоадер с использованием composer на том же примере блога.

Начнем с того, что расположим наши файлы также как и в прошлой статье в архитектуре MVC. У нас будет точка входа index.php, папка src и внутри всё наше содержимое.

src
    Controller
        IndexController.php
    Model
        ArticleModel.php
    View
        ArticleView.php
index.php

 Далее мы запускаем команду инициализации композера

composer init

Далее нам откроется визард композера, который задаст несколько вопросов:


                                            
  Welcome to the Composer config generator  
                                            


This command will guide you through creating your composer.json config.

Package name (<vendor>/<name>) [lgroshev/test]: app/some-app
Description []: some awesome description
Author [l.groshev <OtezVikentiy@gmail.com>, n to skip]: 
Minimum Stability []: stable
Package Type (e.g. library, project, metapackage, composer-plugin) []: project
License []: MIT

Define your dependencies.

Would you like to define your dependencies (require) interactively [yes]?   
Search for a package: 
Would you like to define your dev dependencies (require-dev) interactively [yes]? 
Search for a package: 
Add PSR-4 autoload mapping? Maps namespace "App\SomeApp" to the entered relative path. [src/, n to skip]: 

{
    "name": "app/some-app",
    "description": "some awesome description",
    "type": "project",
    "license": "MIT",
    "autoload": {
        "psr-4": {
            "App\\SomeApp\\": "src/"
        }
    },
    "authors": [
        {
            "name": "l.groshev",
            "email": "OtezVikentiy@gmail.com"
        }
    ],
    "minimum-stability": "stable",
    "require": {}
}

Do you confirm generation [yes]? 
Generating autoload files
Generated autoload files
PSR-4 autoloading configured. Use "namespace App\SomeApp;" in src/
Include the Composer autoloader with: require 'vendor/autoload.php';

После этого у нас сгенерится composer.json файл - в него мы заходим и немного отредактируем секцию autoload.psr-4. Вместо App\\SomeApp\\ напишем App\\, чтобы в итоге выглядело вот так:

{
    "name": "app/some-app",
    "description": "some awesome description",
    "type": "project",
    "license": "MIT",
    "autoload": {
        "psr-4": {
            "App\\": "src/"
        }
    },
    "authors": [
        {
            "name": "l.groshev",
            "email": "OtezVikentiy@gmail.com"
        }
    ],
    "minimum-stability": "stable",
    "require": {}
}

После этого запускаем команду

composer dump-autoload

Эта команда сгенерит файлы автолоадера и теперь нам останется только подключить это всё в index.php и всё.

Теперь для классов внутри src у нас должны быть namespace начинающиеся с App. А в index.php мы можем прописать подключение следующим образом:

<?php

use App\Controller\IndexController;

require_once 'vendor/autoload.php';

$indexController = new IndexController();

echo($indexController->getArticles());

Мы подключили автолоадер и вызвали наш контроллер.

А вот содержимое наших файлов IndexController.php, ArticleModel.php, ArticleView.php:

<?php

namespace App\Controller;

use App\Model\ArticleModel;
use App\View\ArticleView;

class IndexController
{
    public function getArticles(): string
    {
        $articleModel = new ArticleModel();
        $articles = $articleModel->getArticles();
        $view = new ArticleView($articles);
        return $view->render();
    }
}
<?php

namespace App\Model;

class ArticleModel
{
    public function getArticles(): array
    {
        return [
            ['title' => 1, 'text' => 'Loerm ipsum',],
            ['title' => 2, 'text' => 'Loerm ipsum',],
            ['title' => 3, 'text' => 'Loerm ipsum',],
            ['title' => 4, 'text' => 'Loerm ipsum',],
        ];
    }
}
<?php

namespace App\View;

class ArticleView
{
    private array $articles;

    public function __construct(array $articles)
    {
        $this->articles = $articles;
    }

    public function render(): string
    {
        return print_r($this->articles, true);
    }
}

Также мы можем например сделать вспомогательные функции в отдельном файле и добавить их также через автолоадер следующим образом. Создадим файлик functions.php рядом с index.php и положим в него следующее содержимое:

<?php

function printDateTime(): void
{
    print_r(date('Y-m-d H:i:s'));die;
}

Доработаем composer.json добавив секцию autoload.files[]

Не забывайте вызывать команду composer dump-autoload каждый раз когда вносите изменения в composer.json

{
    "name": "app/some-app",
    "description": "some awesome description",
    "type": "project",
    "license": "MIT",
    "autoload": {
        "psr-4": {
            "App\\": "src/"
        },
        "files": [
            "functions.php"
        ]
    },
    "authors": [
        {
            "name": "l.groshev",
            "email": "OtezVikentiy@gmail.com"
        }
    ],
    "minimum-stability": "stable",
    "require": {}
}

Теперь эту функцию можно использовать например в контроллере вот так:

PHP-код класса IndexController с use-импортами AppModel и AppView и вызовом функции printDateTime()

Также, если нам захочется - то мы можем ввести второй Namespace следующим образом... Добавим в composer.json новую строку в раздел auroload:

{
    "name": "app/some-app",
    "description": "some awesome description",
    "type": "project",
    "license": "MIT",
    "autoload": {
        "psr-4": {
            "Opp\\GarbageLibrary\\": "lib/",
            "App\\": "src/"
        },
        "files": [
            "functions.php"
        ]
    },
    "authors": [
        {
            "name": "l.groshev",
            "email": "OtezVikentiy@gmail.com"
        }
    ],
    "minimum-stability": "stable",
    "require": {}
}

Добавим новую папку lib рядом с src и в нее положим файл lib/Actuator/ProfileActuator.php

<?php

namespace Opp\GarbageLibrary\Actuator;

class ProfileActuator
{
    public function getOloloSound()
    {
        print_r('OLOLO!!!');die;
    }
}

Теперь попробуем вызвать этот новый метод нового класса в контроллере src/Controller/IndexController.php

<?php

namespace App\Controller;

use Opp\GarbageLibrary\Actuator\ProfileActuator;

class IndexController
{
    public function getArticles(): string
    {
        $pa = new ProfileActuator();
        $pa->getOloloSound();
    }
}

Не забывайте вызывать команду composer dump-autoload каждый раз когда вносите изменения в composer.json

Вот так вот можно использовать композер и автолоадер.

Надеюсь материал был вам полезен. laugh

Хотите понять, что Composer делает под капотом? Разбор ручной реализации автозагрузчика — в статье PSR-4 без Composer.