我有一个很大的项目需要编程。我曾经使用CodeIgniter进行编码,但是由于他们停止维护框架,因此我决定切换到另一个框架。我选择了Phalcon框架。接下来是我要实现的应用程序的文件夹结构:

  • 应用程式/
  • Controller /
  • 管理员/
  • 用户/
  • UsersController.php
  • UserGroupsController.php
  • 仪表盘/
  • 系统/
  • another_subfolder/
  • AnotherSubFolderController.php
  • 生产/
  • 设置/
    SettingsController.php
  • 仪表盘/
  • 流/
  • another_subfolder/
  • AnotherSubFolderController.php
  • 网站1/
  • 客户/
  • CustomerController.php
  • CompaniesController.php
  • another_subfolder ..../
  • 模型/
  • sub_folder_structure///与 Controller 相同

  • 这只是应用程序文件夹结构的示例。此项目中将有很多文件夹和子文件夹,以使其易于管理。

    据我了解,我需要在加载器中为每个子文件夹注册所有 namespace ,以便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();
    

    装载机看起来会很大。

    然后,我必须设置路由器,以便将请求重定向到正确的 Controller 。现在我有下一个:
    // 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;
    });
    

    如果我需要为每个子文件夹和 namespace 手动设置路由器,那也将非常大。

    所以我的问题是:
  • 有什么方法可以使装载机更漂亮和更小?随着它将变得更大。
  • 如何设置路由器,从而无需输入所有 namespace 和子文件夹的组合?有什么办法可以缩小尺寸?可能是修改调度程序或其他任何类?还是有一种方法可以在路由器中将路径变量设置为 Controller 的位置?

  • 我研究了Phalcon文档,但找不到解决方法。

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

    谢谢

    最佳答案

    广告。 1.您可以将 namespace 更改为更多PSR-0(在我看来),所以我将做:

  • 应用
  • Controller
  • 管理员
  • 用户
  • UsersController.php

  • 您可以注册一个 namespace Admin或任何其他 namespace 。然后,您只需要注册最顶层的命名空间即可工作(请注意,您的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)
            )
        );
    

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

    广告。 2。

    为此,您可以使用groups of routes,以便可以将 namespace 作为构造函数的config数组的参数传递,然后在一个位置执行重复任务。然后,只需创建具有不同参数的新实例即可;

    $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重写为也有一些命名空间的 Controller 。

    关于php - 子文件夹结构的Phalcon Router和Loader越来越大。如何设置?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22668224/

    10-16 08:36