Phalcon 4 Multi-Module MVC Application: Default Module and Controller Issues

28 Views Asked by At

I'm coming to you because I'd like to set up a multi-module MVC application with phalcon 4. I have followed the documentation and my bootstrap file is as follows:

<?php

use Phalcon\Debug;
use Phalcon\Mvc\Application;
use Phalcon\Mvc\Router;
use Phalcon\Session\Manager as SessionManager;
use Phalcon\Session\Adapter\Stream as Session;
use Phalcon\Session\ManagerInterface as SessionManagerInterface;
use Phalcon\Url as UrlResolver;
use Phalcon\Di\FactoryDefault;
use Phalcon\Flash\Direct as Flash;
use Phalcon\Flash\Session as FlashSession;
use Phalcon\Http\Response\Cookies;
use Phalcon\Crypt;
use Phalcon\Db\Adapter\PdoFactory;

error_reporting(E_ALL);

define('APP_PATH', dirname(__DIR__));

try {

    /**
     * Read the configuration
     */
    $config = require_once(APP_PATH . "/apps/frontend/config/config.php");

    /**
     * Define debugger only in development environment
     */
    if(!$config["application"]["production"]) {
        $debug = new Debug();
        $debug->listen(true, true);
    }

    /**
     * The FactoryDefault Dependency Injector automatically registers the right services to provide a full stack framework
     */
    $container = new FactoryDefault();

    //
    $container->set('config', function () use ($config) {
            return $config;
        }
    );
    // The URL component is used to generate all kinds of URLs in the application
    $container->setShared('url', function () {
        $url = new UrlResolver();
        $url->setBaseUri("{$_SERVER['REQUEST_SCHEME']}://{$_SERVER['SERVER_NAME']}/");
        return $url;
    });
    $container->setShared('session', function() {
        $sessionManager = new SessionManager();
        $session = new Session();
        $sessionManager->setAdapter($session);
        if($sessionManager->status() == SessionManagerInterface::SESSION_NONE) {
            $sessionManager->start();
        }
        return $sessionManager;
    });

    // ...

    // Include routing
    $container->set('router', function() {
        $router = new Router();
        $router->setDefaultModule("frontend");
        $router->add(
            '/:module/:controller/:action/:params',
            [
                'module'     => 1,
                'controller' => 2,
                'action'     => 3,
                'params'     => 4,
            ]
        );
        $router->add(
            '/:module/:controller/:action',
            [
                'module'     => 1,
                'controller' => 2,
                'action'     => 3
            ]
        );
        $router->add(
            '/:module/:controller/',
            [
                'module'     => 1,
                'controller' => 2,
                'action'     => "index"
            ]
        );
        $router->add(
            '/:module/:controller/:params',
            [
                'module'     => 1,
                'controller' => 2,
                'action'     => "index",
                'params' => 3
            ]
        );
        $router->add(
            '/:module/:params',
            [
                'module'     => 1,
                'controller' => "index",
                'action'     => "index",
                'params' => 2
            ]
        );
        return $router;
    });

    /**
     * Handle the application request
     */
    $application = new Application($container);

    /**
     * Include modules
     */
    $application->registerModules(array(
        'frontend' => array(
            'className' => Gv\Frontend\Module::class,
            'path' => __DIR__ . '/../apps/frontend/Module.php'
        ),
        'backend' => array(
            'className' => Gv\Backend\Module::class,
            'path' => __DIR__ . '/../apps/backend/Module.php'
        )
    ));

    /**
     * Handle the request
     */
    $application->handle(
        "{$_SERVER['REQUEST_SCHEME']}://{$_SERVER['SERVER_NAME']}/"
    )->send();
} catch (\Exception $e) {
    echo $e->getMessage() . '<br>';
}

I've also defined two classes for each module called ControllerBase, which inherits from Phalcon's Controller class. This ControllerBase class is the parent class of all controllers. This class defines Dispatch Loop Events as beforeExecuteRoute. And I tried to put echoes in each beforeExecuteRoute event to see which controller and which action were called when any route was called.

And my problem was that on every call with any url:

  • the module called was the one defined in the router service $router->setDefaultModule("frontend")
  • the route controller called by default is index
  • the default route action is index

Do you have any idea why I'm having this problem ?

0

There are 0 best solutions below