
2024-05-10
php autoloader - автозагрузка в php через composer
2023-07-31
В прошлой статье мы рассмотрели нативный способ реализации автолоадера по 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": {}
}
Теперь эту функцию можно использовать например в контроллере вот так:
Также, если нам захочется - то мы можем ввести второй 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
Вот так вот можно использовать композер и автолоадер.
Надеюсь материал был вам полезен.
Ура! Я наконец-то дописал статью как собирать собственные бандлы на Symfony 6!!!
Статья про EasyAdmin всё ещё в процессе )))
Не, ну мне же надо на чем-то тестировать твиттер локальный...
Я тут еще много полезного буду выкладывать, так что заходите обязательно почитать.
Сайтик пока что в разработке - это далеко не окончательная версия - по сути это то что удалось слепить за 8 часов.
Комментарии
Valery
2023-07-31 23:19:34Alexandr
2024-02-19 15:14:54