用于子文件夹结构的Phalcon Router和Loader越来越大.怎么设置?

cjr*_*jrb 5 php url-routing phalcon

我有一个非常大的项目,我需要编程.我曾经使用CodeIgniter编码,但由于他们停止维护框架,我决定切换到另一个.我选择了Phalcon框架.我想要实现的应用程序的文件夹结构是:

  • 应用程序/
    • 控制器/
      • 管理员/
        • 用户/
          • UsersController.php
          • UserGroupsController.php
        • 仪表板/
        • 系统/
        • another_subfolder /
          • AnotherSubFolderController.php
      • 生产/
        • settings/SettingsController.php
        • 仪表板/
        • 流/
        • another_subfolder /
          • AnotherSubFolderController.php
      • 网站1 /
        • 顾客/
          • CustomersController.php
          • CompaniesController.php
        • another_subfolder .... /
    • 楷模/
      • sub_folder_structure///与控制器相同

这只是应用程序的文件夹结构的示例.此项目中将有相当多的文件夹和子文件夹,以使其可管理.

根据我的理解,我需要在加载器中为每个子文件夹注册所有名称空间,以便Phalcon知道在哪里搜索并加载该类.

//Register an autoloader
$loader = new \Phalcon\Loader();

$loader->registerNamespaces(array(
// Main
'Controllers' =>'app/controllers/',
'Models' =>'app/models/',
// Admin Routing
'Controllers\Admin'=>'app/controllers/admin',
'Models\Admin'=>'app/models/admin',
'Controllers\Admin'=>'app/controllers/admin',
'Models\Admin'=>'app/models/admin',
'Controllers\Admin\Users'=>'app/controllers/admin/users',
'Models\Admin\Users'=>'app/models/admin/users'

))->register();
Run Code Online (Sandbox Code Playgroud)

装载机看起来很大.

然后我必须设置路由器,以便将请求重定向到正确的控制器.现在我有下一个:

// Setup Router
$di->set('router', function(){

     $router = new \Phalcon\Mvc\Router(false);

     $router->removeExtraSlashes(true);

     $router->add('/', array(
        'namespace' => 'Controllers',
        'controller' => "login"
     ));

      $router->add('/:controller/:action/', array(
        'namespace' => 'Controllers',
        'controller' => 1,
        'action' =>2
     ));

      $router->add('/admin/:controller/:action/', array(
        'namespace' => 'Controllers\Admin',
        'controller' => 1,
        'action' =>2
     ));

     $router->add('/admin/users/:controller/:action/', array(
        'namespace' => 'Controllers\Admin\Users',
        'controller' => 1,
        'action' =>2
     ));

     return $router;
});
Run Code Online (Sandbox Code Playgroud)

如果我需要为每个子文件夹和命名空间手动设置路由器,那也将非常大.

所以我的问题是:

  1. 有没有办法让装载机更漂亮更小?因为它会变大.
  2. 如何设置路由器以便我不需要输入所有命名空间和子文件夹的组合?有没有办法让它变小?可能是修改调度员或任何其他类?或者有没有办法在路由器中将路径变量设置到控制器的位置?

我研究过Phalcon文档,但找不到这样做的方法.

非常感谢任何帮助和建议.

谢谢

jod*_*tor 2

广告。1.您可以将命名空间更改为更多 PSR-0(在我看来),所以我会:

  • 应用程序
    • 控制器
      • 行政
        • 用户
          • 用户控制器.php

您可以注册一个名称空间Admin或任何其他名称空间。然后,您只需要注册最顶层的命名空间即可工作(请记住,您UsersController必须namespace Admin\Users\UsersController;工作)。Thena 自动加载器应该只有:

 $loader
    ->registerDirs(
        array(
            // It's taken from my config so path may be different
            __DIR__ . '/../../app/controllers/'
            // other namespaces here (like for models)
        )
    );
Run Code Online (Sandbox Code Playgroud)

我正在使用registerDirs,所以我只将加载程序指向存在某些命名空间的文件夹。

广告。2.

为此,您可以使用路由组,以便可以将命名空间作为构造函数配置数组的参数传递,然后在一个地方执行重复任务。然后只需创建具有不同参数的新实例即可;

$router->addGroup(new MahGroup(array('namespace' => 'Mah\\Controller'));
Run Code Online (Sandbox Code Playgroud)

所以 MahGroup 类内部可能是:

class MahGroup extends Phalcon\Mvc\Router\Group {
    public function _construct($config = array()) {
       $this->setPrefix('/' . $config['perfix']);
       $router->add('/:controller/:action/', array(
          'namespace' => $config['namespace'],
          'controller' => 1,
          'action' => 2
       ));
       // etc...
    }
}
Run Code Online (Sandbox Code Playgroud)

然后配置路由:

$router->addGroup( new MahGroup(array('prefix' => 'mah-namespace', 'namespace' => 'Mah\\Namespace' )) );
$router->addGroup( new MahGroup(array('prefix' => 'mah-other-namespace', 'namespace' => 'Mah\\Other\\Namespace' )) );
Run Code Online (Sandbox Code Playgroud)

但第二个问题给出的例子正是可以做的。我通常Group为每个命名空间创建类,然后声明我的应用程序使用的一些路由,因为我没有使用英文名称作为路由,并且我需要将波兰 URL 重写到也有一些命名空间的控制器。