Урок 2: Знакомство с INVO
В этом втором руководстве мы объясним более полное приложение, чтобы глубже понять разработку с помощью Phalcon. INVO — одно из примеров приложений, которые мы создали. INVO — небольшой веб-сайт, который позволяет пользователям генерировать счета-фактуры и выполнять другие задачи, такие как управление клиентами и продуктами. Вы можете клонировать его код с Github.
INVO был создан с использованием клиентской библиотеки Bootstrap. Хотя приложение не генерирует реальные счета-фактуры, оно по-прежнему служит примером, показывающим, как работает фреймворк.
Структура проекта
После клонирования проекта в корневой каталог вы увидите следующую структуру:
invo/
app/
config/
controllers/
forms/
library/
logs/
models/
plugins/
views/
cache/
volt/
docs/
public/
css/
fonts/
js/
schemas/
Как вы знаете, Phalcon не навязывает определенной структуры файлов для разработки приложений. В этом проекте используется простая структура MVC и корневой каталог документов.
После открытия приложения в вашем браузере http://localhost/invo вы увидите что-то вроде этого:
Приложение разделено на две части: фронтенд и бэкенд. Фронтенд — это общедоступная область, где посетители могут получить информацию об INVO и запросить контактную информацию. Бэкенд — это административная область, где зарегистрированные пользователи могут управлять своими продуктами и клиентами.
Маршрутизация
INVO использует стандартный маршрут, встроенный в компонент Router. Эти маршруты соответствуют следующему шаблону: /:controller/:action/:params. Это означает, что первая часть URI — это контроллер, вторая — действие контроллера, а остальные — параметры.
Следующий маршрут /session/register выполняет контроллер SessionController и его действие registerAction.
Настройка
INVO имеет файл конфигурации, который устанавливает общие параметры в приложении. Этот файл расположен в app/config/config.ini и загружается в первых строках загрузки приложения (public/index.php):
use Phalcon\Config\Adapter\Ini as ConfigIni;
// ...
// Read the configuration
$config = new ConfigIni(
APP_PATH . "app/config/config.ini"
);
Phalcon\Config позволяет нам манипулировать файлом объектно-ориентированным способом. В этом примере мы используем файл ini для конфигурации, но Phalcon имеет адаптеры и для других типов файлов. Файл конфигурации содержит следующие настройки:
[database] host = localhost username = root password = secret name = invo [application] controllersDir = app/controllers/ modelsDir = app/models/ viewsDir = app/views/ pluginsDir = app/plugins/ formsDir = app/forms/ libraryDir = app/library/ baseUri = /invo/
Phalcon не имеет каких-либо предопределенных соглашений по настройке. Разделы помогают нам организовать параметры соответствующим образом. В этом файле есть два раздела, которые будут использоваться позже: «application» и «database».
Автозагрузчики
Вторая часть, которая появляется в файле загрузки (public/index.php), — это автозагрузчик:
/** * Auto-loader configuration */ require APP_PATH . "app/config/loader.php";
Автозагрузчик регистрирует набор каталогов, в которых приложение будет искать классы, которые ему в конечном итоге потребуются.
$loader = new Phalcon\Loader();
// We're a registering a set of directories taken from the configuration file
$loader->registerDirs(
[
APP_PATH . $config->application->controllersDir,
APP_PATH . $config->application->pluginsDir,
APP_PATH . $config->application->libraryDir,
APP_PATH . $config->application->modelsDir,
APP_PATH . $config->application->formsDir,
]
);
$loader->register();
Обратите внимание, что в приведенном выше коде были зарегистрированы каталоги, определенные в файле конфигурации. Единственный каталог, который не зарегистрирован, — это viewsDir, потому что он содержит файлы HTML + PHP, но не классы. Также обратите внимание, что мы используем константу APP_PATH. Эта константа определена в загрузчике (public/index.php), чтобы предоставить ссылку на корень нашего проекта:
// ...
define(
"APP_PATH",
realpath("..") . "/"
);
Регистрация сервисов
Другой необходимый файл в файле загрузки — (app/config/services.php). Этот файл позволяет нам организовать сервисы, используемые INVO.
/** * Load application services */ require APP_PATH . "app/config/services.php";
Регистрация сервисов выполняется, как и в предыдущем уроке, с использованием замыканий для ленивой загрузки необходимых компонентов:
use Phalcon\Mvc\Url as UrlProvider;
// ...
/**
* The URL component is used to generate all kind of URLs in the application
*/
$di->set(
"url",
function () use ($config) {
$url = new UrlProvider();
$url->setBaseUri(
$config->application->baseUri
);
return $url;
}
);
Мы подробно обсудим этот файл позже.
Обработка запроса
Если мы перейдем к концу файла (public/index.php), запрос обрабатывается классом Phalcon\Mvc\Application, который инициализирует и выполняет все необходимое для работы приложения:
use Phalcon\Mvc\Application; // ... $application = new Application($di); $response = $application->handle(); $response->send();
Внедрение зависимостей
В первой строке блока кода выше конструктор класса Application получает переменную $di в качестве аргумента. В чем смысл этой переменной? Phalcon — это высокодекомпозированный фреймворк, поэтому нам нужен компонент, который будет служить связующим звеном для совместной работы всех компонентов. Этот компонент — Phalcon\Di. Это контейнер сервисов, который также выполняет внедрение зависимостей и поиск сервисов, создавая все компоненты по мере необходимости для приложения.
Существует много способов регистрации сервисов в контейнере. В INVO большинство сервисов зарегистрированы с использованием анонимных функций/замыканий. Благодаря этому, объекты инициализируются ленивым способом, уменьшая ресурсы, необходимые приложению.
Например, в следующем фрагменте регистрируется сервис сессии. Анонимная функция будет вызвана только тогда, когда приложение потребует доступа к данным сессии:
use Phalcon\Session\Adapter\Files as Session;
// ...
// Start the session the first time a component requests the session service
$di->set(
"session",
function () {
$session = new Session();
$session->start();
return $session;
}
);
Здесь у нас есть свобода изменения адаптера, выполнения дополнительной инициализации и многое другое. Обратите внимание, что сервис был зарегистрирован под именем «session». Это соглашение позволит фреймворку идентифицировать активный сервис в контейнере сервисов.
Запрос может использовать множество сервисов, и регистрация каждого сервиса индивидуально может быть трудоемкой задачей. Поэтому фреймворк предоставляет вариант Phalcon\Di под названием Phalcon\Di\FactoryDefault, задача которого — регистрировать все сервисы, предоставляя полнофункциональный фреймворк.
use Phalcon\Di\FactoryDefault; // ... // The FactoryDefault Dependency Injector automatically registers the // right services providing a full-stack framework $di = new FactoryDefault();
Он регистрирует большинство сервисов с компонентами, предоставляемыми фреймворком по умолчанию. Если нам нужно переопределить определение какого-либо сервиса, мы можем просто установить его снова, как мы сделали выше с «session» или «url». В этом и заключается смысл переменной $di.
В следующей главе мы увидим, как в INVO реализована аутентификация и авторизация.
© 2011–2017 Phalcon Framework Team
Licensed under the Creative Commons Attribution License 3.0.
https://docs.phalconphp.com/en/latest/reference/tutorial-invo.html