004 Vokuro
Vökuró еще один пример приложения вы можете использовать, чтобы узнать больше о "Phalcon". Vökuró - это небольшой сайт, который показывает, как реализовать функции безопасности и управления пользователями и разрешениями. Вы можете клонировать его код из Github.
Cтруктура проекта
После клонирования проекта в корне документа вы увидите следующую структуру:
vokuro/
    app/
        config/
        controllers/
        forms/
        library/
        models/
        views/
    cache/
    public/
        css/
        img/
    schemas/Этот проект следует довольно похожей структуре INVO. Как только вы открываете приложение в вашем браузере http://localhost/vokuro вы увидите нечто подобное:

Приложение разделено на две части, интерфейс, где посетители могут зарегистрироваться службы и серверной, где административные пользователи могут управлять зарегистрированными пользователями. И frontend и backend совмещены в едином модуле.
Загрузка классов и зависимостей
Этот проект Phalcon\Loader для загрузки контроллеров, моделей, форм и т. д. внутри проекта и composer для загрузки зависимостей проекта. Итак, первое, что вам нужно сделать перед выполнением Vökuró, это установить его зависимости через composer. Если он установлен правильно, введите в консоли следующую команду:
cd vokuro composer install
Vökuró отправляет электронные письма для подтверждения регистрации зарегистрированных пользователей с помощью Swift, composer.json выглядит так:
{
    "require" : {
        "php": ">=5.5.0",
        "ext-phalcon": ">=3.0.0",
        "swiftmailer/swiftmailer": "^5.4",
        "amazonwebservices/aws-sdk-for-php": "~1.0"
    }
}
Теперь есть файл app/config/loader.php , где настроен весь материал автоматической загрузки. В конце этого файла вы можете увидеть, что включен автозагрузчик composer, позволяющий приложению автоматически загружать любые классы в загруженных зависимостях:
<?php // ... // Использовать автозагрузчик composer для загрузки классов поставщиков require_once BASE_PATH . '/vendor/autoload.php';
Кроме того, Vökuró, в отличие от INVO, использует пространства имен для контроллеров и моделей, что является рекомендуемой практикой для структурирования проекта. Таким образом, автозагрузчик выглядит немного иначе, чем тот, который мы видели раньше  (app/config/loader.php):
<?php
use Phalcon\Loader;
$loader = new Loader();
$loader->registerNamespaces(
    [
        'Vokuro\Models'      => $config->application->modelsDir,
        'Vokuro\Controllers' => $config->application->controllersDir,
        'Vokuro\Forms'       => $config->application->formsDir,
        'Vokuro'             => $config->application->libraryDir,
    ]
);
$loader->register();
// ...
Вместо registerDirectories(), мы используем registerNamespaces(). Каждое пространство имен указывает на каталог, определенный в файле конфигурации (app/config/config.php). Например, пространство имен Vokuro\Controllers указывает на app/controllers , поэтому все классы, требуемые приложением в этом пространстве имен, требуют его определения:
<?php
namespace Vokuro\Controllers;
class AboutController extends ControllerBase
{
    // ...
}
Подписка
Во-первых, давайте проверим, как пользователи регистрируются в Vökuró. Когда пользователь нажимает кнопку Создать учетную запись, вызывается контроллер SessionController и выполняется действие signup :
<?php
namespace Vokuro\Controllers;
use Vokuro\Forms\SignUpForm;
class SessionController extends ControllerBase
{
    public function signupAction()
    {
        $form = new SignUpForm();
        // ...
        $this->view->form = $form;
    }
}
Это действие просто передает в представление экземпляр формы SignUpForm , который выводится, чтобы пользователь мог ввести учетные данные:
{{ form('class': 'form-search') }}
    <h2>
        Sign Up
    </h2>
    <p>{{ form.label('name') }}</p>
    <p>
        {{ form.render('name') }}
        {{ form.messages('name') }}
    </p>
    <p>{{ form.label('email') }}</p>
    <p>
        {{ form.render('email') }}
        {{ form.messages('email') }}
    </p>
    <p>{{ form.label('password') }}</p>
    <p>
        {{ form.render('password') }}
        {{ form.messages('password') }}
    </p>
    <p>{{ form.label('confirmPassword') }}</p>
    <p>
        {{ form.render('confirmPassword') }}
        {{ form.messages('confirmPassword') }}
    </p>
    <p>
        {{ form.render('terms') }} {{ form.label('terms') }}
        {{ form.messages('terms') }}
    </p>
    <p>{{ form.render('Sign Up') }}</p>
    {{ form.render('csrf', ['value': security.getToken()]) }}
    {{ form.messages('csrf') }}
    <hr>
{{ endForm() }}
