
2024-05-10
php autoloader - автозагрузка в php - как организовать PSR-4
2023-07-31
Есть несколько подходов к организации автолоадера. Сегодня мы рассмотрим один из них.
Реализация autoloader по PSR-4 без composer ( closure example )
На примере простейшего приложения мы разберем как реализовать простейший автозагрузчик.
Предположим, что у нас есть блог и мы в нем выводим на экран статью. Мы хотим в простейшем варианте реализовать MVC архитектуру и реализовать контроллер, модель и вьюху. И также нам нужна одна единая точка входа index.php
Файловая структура у нас будет выглядеть так:
src
Controller
IndexController.php
Model
ArticleModel.php
View
ArticleView.php
autoload.php
index.php
Используя PSR-4 мы можем определить для себя такой вот файлик autoload.php
<?php
function autoloaderFunction(string $class): void
{
$prefix = 'App\\'; //определяем неймспейс для нашего приложения
$len = strlen($prefix);
if (strncmp($prefix, $class, $len) !== 0) return;
$relative_class = substr($class, $len); //определяем класс
$base_dir = __DIR__ . '/src/'; //определяем директорию
$file = $base_dir . str_replace('\\', '/', $relative_class) . '.php'; //определяем полный путь до файла
if (file_exists($file)) { //если файл существует
require_once $file; //подключаем
}
}
spl_autoload_register('autoloaderFunction');
Далее создаем для себя точку входа в приложение index.php
<?php
use App\Controller\IndexController;
require_once 'autoload.php'; //подключаем наш автолоадер
$indexController = new IndexController(); //подключаем наш контроллер
echo($indexController->getArticles()); //вызываем метод контроллера
Создаем файлик вьюху в самом простом виде ArticleView.php
<?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);
}
}
Создаём модель статей ArticleModel.php:
<?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',],
];
}
}
И наконец создаем контроллер IndexController.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();
}
}
Таким образом у нас получилась простейшая схема, которую дальше можно расширять. У нас есть единая точка входа в виде index.php, есть автозагрузчик, который подгружает автоматически все классы, которые находятся внутри неймспейса.
Ура! Я наконец-то дописал статью как собирать собственные бандлы на Symfony 6!!!
Статья про EasyAdmin всё ещё в процессе )))
Не, ну мне же надо на чем-то тестировать твиттер локальный...
Я тут еще много полезного буду выкладывать, так что заходите обязательно почитать.
Сайтик пока что в разработке - это далеко не окончательная версия - по сути это то что удалось слепить за 8 часов.
Комментарии