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