Spec-Zone.ru › Phalcon 3

MVC-приложения

Вся сложная работа по организации работы MVC в Phalcon обычно выполняется компонентом Phalcon\Mvc\Application. Этот компонент инкапсулирует все сложные операции, выполняемые в фоновом режиме, создавая каждый необходимый компонент и интегрируя его в проект, чтобы шаблон MVC работал так, как нужно.

Одномодульные или многомодульные приложения

С помощью этого компонента вы можете запускать различные типы структур MVC:

Одномодульное

Одномодульные MVC-приложения состоят только из одного модуля. Имена пространств могут быть использованы, но не являются обязательными. Структура файлов такого приложения будет следующей:

single/
    app/
        controllers/
        models/
        views/
    public/
        css/
        img/
        js/

Если имена пространств не используются, для организации потока MVC можно использовать следующий файл загрузки:

use Phalcon\Loader;
use Phalcon\Mvc\View;
use Phalcon\Mvc\Application;
use Phalcon\Di\FactoryDefault;

$loader = new Loader();

$loader->registerDirs(
    [
        "../apps/controllers/",
        "../apps/models/",
    ]
);

$loader->register();

$di = new FactoryDefault();

// Registering the view component
$di->set(
    "view",
    function () {
        $view = new View();

        $view->setViewsDir("../apps/views/");

        return $view;
    }
);

$application = new Application($di);

try {
    $response = $application->handle();

    $response->send();
} catch (\Exception $e) {
    echo $e->getMessage();
}

Если используются имена пространств, можно использовать следующий загрузчик:

use Phalcon\Loader;
use Phalcon\Mvc\View;
use Phalcon\Mvc\Dispatcher;
use Phalcon\Mvc\Application;
use Phalcon\Di\FactoryDefault;

$loader = new Loader();

// Use autoloading with namespaces prefixes
$loader->registerNamespaces(
    [
        "Single\\Controllers" => "../apps/controllers/",
        "Single\\Models"      => "../apps/models/",
    ]
);

$loader->register();

$di = new FactoryDefault();

// Register the default dispatcher's namespace for controllers
$di->set(
    "dispatcher",
    function () {
        $dispatcher = new Dispatcher();

        $dispatcher->setDefaultNamespace("Single\\Controllers");

        return $dispatcher;
    }
);

// Register the view component
$di->set(
    "view",
    function () {
        $view = new View();

        $view->setViewsDir("../apps/views/");

        return $view;
    }
);

$application = new Application($di);

try {
    $response = $application->handle();

    $response->send();
} catch (\Exception $e) {
    echo $e->getMessage();
}

Многомодульное

Многомодульное приложение использует один корневой каталог для нескольких модулей. В этом случае можно использовать следующую структуру файлов:

multiple/
  apps/
    frontend/
       controllers/
       models/
       views/
       Module.php
    backend/
       controllers/
       models/
       views/
       Module.php
  public/
    css/
    img/
    js/

Каждая папка в apps/ имеет свою собственную MVC-структуру. Файл Module.php присутствует для настройки специфических параметров каждого модуля, таких как автозагрузчики или пользовательские сервисы:

namespace Multiple\Backend;

use Phalcon\Loader;
use Phalcon\Mvc\View;
use Phalcon\DiInterface;
use Phalcon\Mvc\Dispatcher;
use Phalcon\Mvc\ModuleDefinitionInterface;

class Module implements ModuleDefinitionInterface
{
    /**
     * Register a specific autoloader for the module
     */
    public function registerAutoloaders(DiInterface $di = null)
    {
        $loader = new Loader();

        $loader->registerNamespaces(
            [
                "Multiple\\Backend\\Controllers" => "../apps/backend/controllers/",
                "Multiple\\Backend\\Models"      => "../apps/backend/models/",
            ]
        );

        $loader->register();
    }

    /**
     * Register specific services for the module
     */
    public function registerServices(DiInterface $di)
    {
        // Registering a dispatcher
        $di->set(
            "dispatcher",
            function () {
                $dispatcher = new Dispatcher();

                $dispatcher->setDefaultNamespace("Multiple\\Backend\\Controllers");

                return $dispatcher;
            }
        );

        // Registering the view component
        $di->set(
            "view",
            function () {
                $view = new View();

                $view->setViewsDir("../apps/backend/views/");

                return $view;
            }
        );
    }
}

Для загрузки многомодульной архитектуры MVC требуется специальный файл загрузки:

use Phalcon\Mvc\Router;
use Phalcon\Mvc\Application;
use Phalcon\Di\FactoryDefault;

$di = new FactoryDefault();

// Specify routes for modules
// More information how to set the router up https://docs.phalconphp.com/en/latest/reference/routing.html
$di->set(
    "router",
    function () {
        $router = new Router();

        $router->setDefaultModule("frontend");

        $router->add(
            "/login",
            [
                "module"     => "backend",
                "controller" => "login",
                "action"     => "index",
            ]
        );

        $router->add(
            "/admin/products/:action",
            [
                "module"     => "backend",
                "controller" => "products",
                "action"     => 1,
            ]
        );

        $router->add(
            "/products/:action",
            [
                "controller" => "products",
                "action"     => 1,
            ]
        );

        return $router;
    }
);

// Create an application
$application = new Application($di);

// Register the installed modules
$application->registerModules(
    [
        "frontend" => [
            "className" => "Multiple\\Frontend\\Module",
            "path"      => "../apps/frontend/Module.php",
        ],
        "backend"  => [
            "className" => "Multiple\\Backend\\Module",
            "path"      => "../apps/backend/Module.php",
        ]
    ]
);

try {
    // Handle the request
    $response = $application->handle();

    $response->send();
} catch (\Exception $e) {
    echo $e->getMessage();
}

Если вы хотите сохранить конфигурацию модулей в файле загрузки, вы можете использовать анонимную функцию для регистрации модуля:

use Phalcon\Mvc\View;

// Creating a view component
$view = new View();

// Set options to view component
// ...

// Register the installed modules
$application->registerModules(
    [
        "frontend" => function ($di) use ($view) {
            $di->setShared(
                "view",
                function () use ($view) {
                    $view->setViewsDir("../apps/frontend/views/");

                    return $view;
                }
            );
        },
        "backend" => function ($di) use ($view) {
            $di->setShared(
                "view",
                function () use ($view) {
                    $view->setViewsDir("../apps/backend/views/");

                    return $view;
                }
            );
        }
    ]
);

Когда у Phalcon\Mvc\Application зарегистрированы модули, всегда необходимо, чтобы каждый соответствующий маршрут возвращал действительный модуль. Каждый зарегистрированный модуль имеет связанный класс, предлагающий функции для настройки самого модуля. Определение каждого класса модуля должно реализовывать два метода: registerAutoloaders() и registerServices(), которые будут вызываться Phalcon\Mvc\Application в зависимости от выполняемого модуля.

События приложения

Phalcon\Mvc\Application может отправлять события в EventsManager (если он присутствует). События вызываются с типом «application». Поддерживаются следующие события:

Имя события Вызвано
boot Выполняется при обработке первым запросом приложения
beforeStartModule Перед инициализацией модуля, только когда модули зарегистрированы
afterStartModule После инициализации модуля, только когда модули зарегистрированы
beforeHandleRequest Перед выполнением цикла диспетчеризации
afterHandleRequest После выполнения цикла диспетчеризации

Следующий пример демонстрирует, как подключить обработчики к этому компоненту:

use Phalcon\Events\Event;
use Phalcon\Events\Manager as EventsManager;

$eventsManager = new EventsManager();

$application->setEventsManager($eventsManager);

$eventsManager->attach(
    "application",
    function (Event $event, $application) {
        // ...
    }
);

Внешние ресурсы

  • Примеры MVC на Github

© 2011–2017 Phalcon Framework Team
Licensed under the Creative Commons Attribution License 3.0.
https://docs.phalconphp.com/en/latest/reference/applications.html

Spec-Zone.ru

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