Phalcon7 多模塊應(yīng)用

2018-10-22 20:48 更新

多模塊的應(yīng)用使用了相同的文檔根目錄但擁有多個(gè)模塊。在這種情況下,可以使用以下的文件目錄結(jié)構(gòu):

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

模塊定義類(Module Define Class)?

在`apps/下的每一個(gè)目錄都有自己的 MVC 結(jié)構(gòu)。`Module.php 文件定義了各個(gè)模塊不同的配置,如自動加載器、視圖和自定義服務(wù):

<?php

namespace Multiple\Backend;

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

class BackendModule implements ModuleDefinitionInterface
{
    /**
     * 注冊自定義加載器
     */
    public function registerAutoloaders()
    {
        $loader = new Loader();

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

        $loader->register();
    }

    /**
     * 注冊自定義服務(wù)
     */
    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;
        });
    }
}

還需要一個(gè)指定的啟動文件來加載多模塊的MVC架構(gòu):

<?php

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

$di = new FactoryDefault();

// 自定義路由
// More information how to set the router up https://docs.phalconphp.com/zh/latest/reference/routing.html
$di->set('router', function () {

    $router = new Router();

    $router->setDefaultModule("frontend");

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

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

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

    return $router;
});

try {

    // 創(chuàng)建應(yīng)用
    $application = new Application($di);

    // 注冊模塊,包含設(shè)置模塊定義類加載位置
    $application->registerModules(
        array(
            'frontend' => array(
                'className' => 'Multiple\Frontend\Module',
                'path'      => '../apps/frontend/Module.php',
            ),
            'backend'  => array(
                'className' => 'Multiple\Backend\BackendModule',
                'path'      => '../apps/backend/Module.php',
            )
        )
    );

    // 處理請求
    echo $application->handle()->getContent();

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

你也可以直接實(shí)例化模塊定義類,類進(jìn)行注冊:

<?php

    require('../apps/backend/Module.php');
    require('../apps/frontend/Module.php');

    // 注冊模塊
    $application->registerModules(
        array(
            'frontend' => new FrontendModule,
            'backend'  => new BackendModule
        )
    );

如果你想在啟動文件進(jìn)行相關(guān)組件配置,你可以使用匿名函數(shù)來注冊對應(yīng)的模塊:

<?php

use Phalcon\Mvc\View;

// 創(chuàng)建視圖組件
$view = new View();

// 設(shè)置視圖組件相關(guān)選項(xiàng)
// ...

// Register the installed modules
$application->registerModules(
    array(
        '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;
            });
        }
    )
);

當(dāng) Phalcon\Mvc\Application 有多個(gè)模塊注冊時(shí),通常 每個(gè)都是需要的,以便每一個(gè)被匹配到的路由都能返回一個(gè)有效的模塊。每個(gè)已經(jīng)注冊的模塊都有一個(gè)相關(guān)的類來提供建立和啟動自身的函數(shù)。 而每個(gè)模塊定義的類都必須實(shí)現(xiàn)registerAutoloaders()和registerServices()這兩個(gè)方法,這兩個(gè)函數(shù)會在模塊即被執(zhí)行時(shí)被 Phalcon\Mvc\Application 調(diào)用。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號