费尔康路由器和加载器的子文件夹结构越来越大.如何设置


Phalcon Router and Loader for subfolder structure getting bigger. How to set up?

我有一个相当大的项目,我需要编程。我曾经使用CodeIgniter编写代码,但自从他们停止维护框架以来,我决定切换到另一个。我选择了Phalcon框架。下面是我要实现的应用程序的文件夹结构:

  • 应用程序/
    • 控制器/
      • 管理/
          /
        • 用户
          • UsersController.php
          • UserGroupsController.php
        • 仪表板/
        • 系统/
        • another_subfolder/
          • AnotherSubFolderController.php
      • 生产/
        • /
        • 设置SettingsController.php
        • 仪表板/
        • 流/
        • another_subfolder/
          • AnotherSubFolderController.php
      • website1/
        • 客户/
          • CustomersController.php
          • CompaniesController.php
        • another_subfolder……/
    • /
    • 模型
      • sub_folder_structure///与controllers相同

这只是应用程序文件夹结构的一个例子。将有相当多的文件夹和子文件夹在这个项目,使其易于管理。

根据我的理解,我需要在每个子文件夹的加载器中注册所有名称空间,以便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();

加载器将看起来相当大。

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

// 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;
});

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

所以我的问题是:

  1. 有没有办法使加载器更漂亮和更小?因为它会越来越大。
  2. 我如何设置路由器,这样我就不需要输入所有的命名空间和子文件夹的组合?有没有办法把它弄小一点?可以修改调度程序或任何其他类吗?或者我是否可以在路由器中设置路径变量到控制器的位置?

我已经研究了Phalcon文档,但是找不到这样做的方法。

任何帮助和建议都是非常感谢的。

谢谢

广告。1. 您可以将您的名称空间更改为更PSR-0(在我看来),因此我将使用:

  • 应用程序
    • 控制器
      • 管理
        • 用户
          • UsersController.php

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

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

我使用registerDirs,所以我只把加载器指向一些命名空间存在的文件夹。

广告。2 .

对于这个,你可以使用路由组,这样你就可以传递一个命名空间作为构造函数的配置数组的参数,然后在一个地方做重复的任务。然后用不同的参数创建新的实例;

$router->addGroup(new MahGroup(array('namespace' => 'Mah''Controller'));

所以在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...
    }
}

然后配置路由:

$router->addGroup( new MahGroup(array('prefix' => 'mah-namespace', 'namespace' => 'Mah''Namespace' )) );
$router->addGroup( new MahGroup(array('prefix' => 'mah-other-namespace', 'namespace' => 'Mah''Other''Namespace' )) );

但第二个问题给出的例子只是可以做什么。我通常为每个命名空间创建Group类,然后声明我的应用程序使用的一些路由,因为我不使用英文名称的路由,我需要重写优化url到控制器也有一些命名空间。