Spec-Zone.ru › Phalcon 3

Урок 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 вы увидите что-то вроде этого:

../_images/invo-1.png

Приложение разделено на две части: фронтенд и бэкенд. Фронтенд — это общедоступная область, где посетители могут получить информацию об 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API