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() }}