Установка
Фреймворк Medusa поставляется как компактное решение для небольших и средних проектов. В этом разделе показан минимальный путь от пустого проекта до первого рабочего маршрута.
Создание файла .env
В корне проекта уже находится файл .env.example. Скопируйте его в .env и при необходимости
скорректируйте базовые параметры приложения:
ENV_FILE = ./.env
APP_URL = http://localhost:8001
APP_SET_UTC_TIME_ZONE = true
BOOTSTRAP_PDO_AUTOCONNECT = true
PDO_TYPE = mysql
PDO_PORT = 3306
PDO_NAME = app
PDO_CHARSET = utf8mb4
PDO_USER = medusa
PDO_PASSWORD = medusa
DB_WAIT_TIMEOUT = 300
DB_SET_UTC_TIME_ZONE = true
FROM_MAIL = app@mail.ru
REPLY_TO_MAIL = noreply@mail.ru
STORAGE_ROOT_PATH = /storage
STORAGE_DIR_PERMISSIONS = 0755
STORAGE_FILE_PERMISSIONS = 0644
BOOTSTRAP_REDIS_AUTOCONNECT = true
REDIS_SCHEME = tcp
REDIS_PORT = 6379
BOOTSTRAP_RMQ_AUTOCONNECT = true
RMQ_PORT = 5672
RMQ_USER = guest
RMQ_PASS = guest
Настройка msmtp
Если приложению нужна отправка почты, заполните файл .docker/etc/msmtprc данными вашего SMTP-сервера:
account default
auth on
tls on
tls_starttls off
tls_certcheck off
host mail.medusa.ru
port 465
user app@mail.ru
password qwerty123456
logfile /var/log/msmtp.log
Подготовка дампа базы данных
Если проекту нужен стартовый набор таблиц или тестовых данных, добавьте SQL-запросы в файл
.data/dump.sql. Они будут автоматически выполнены при первом запуске контейнера базы данных.
Добавление тестового маршрута
Откройте файл www/routes/web.php и добавьте в него минимальный маршрут с Twig-шаблоном и Vite-entry:
use Medusa\Http\Route;
use Medusa\Http\Request;
use Medusa\Http\Response;
use Medusa\Helpers\Frontend;
Route::get('/greeting', function (Request $request) {
return new Response\Html(
Frontend::twig('themes')
->include('default', [
'html' => [
'lang' => 'ru',
],
'head' => [
'title' => 'Приветствие',
],
])
->with(
Frontend::vite('themes')->include('default', [
'title' => 'Добро пожаловать!',
'subTitle' => 'Это страница приветствия!',
])
)
->html(true),
200, false
);
});
Создайте файл www/frontend/themes/default/index.html.twig:
<!doctype html>
<html lang="{{ html.lang | default('en') }}">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{{ head.title | default('Page') }}</title>
{{ head.preload | join('\n\t') | raw }}
{{ head.styles | join('\n\t') | raw }}
</head>
<body>
{{ body.content | join('\n\t') | raw }}
{{ body.scripts | join('\n\t') | raw }}
{{ body.state | join('\n\t') | raw }}
</body>
</html>
Создайте файл www/frontend/themes/default/entry.js:
import {mount} from '@shared/js/mount';
import {state} from '@shared/js/state';
import {createApp} from 'vue';
import DefaultTheme from './DefaultTheme.vue';
import './style.css';
mount('default')
.state(state)
.each((node, props) => {
createApp(DefaultTheme, props).mount(node);
});
Создайте файл www/frontend/themes/default/DefaultTheme.vue:
<script setup>
import {defaultThemeProps} from './props.js';
defineProps(defaultThemeProps);
</script>
<template>
<h1>{{ title }}</h1>
<p>{{ subTitle }}</p>
</template>
Создайте файл www/frontend/themes/default/props.js:
export const defaultThemeProps = {
title: {
type: String,
required: true,
},
subTitle: {
type: String,
required: true,
},
};
Создайте файл www/frontend/themes/default/style.css:
h1 {
color: blue;
}
p {
color: green;
}
Сборка и запуск контейнеров
Выполните команду в терминале:
docker compose up -d --build
Вход в контейнер
Если зависимости или frontend-сборку нужно обновить вручную, сначала войдите в web-контейнер:
docker exec -it <имя_контейнера> /bin/bash
Установка Composer-зависимостей
Для установки PHP-пакетов выполните команду внутри контейнера:
composer install --no-dev --optimize-autoloader
Установка npm-зависимостей
Для установки npm-пакетов выполните команду внутри контейнера:
npm install
Сборка frontend-части
После установки npm-зависимостей выполните сборку frontend-части:
npm run build
Проверка результата
Откройте в браузере адрес http://localhost:8001/greeting/.
Если всё настроено корректно, вы увидите:
Добро пожаловать!
Это страница приветствия!