我有一个相当大的项目,我需要编程。我曾经使用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;
});
如果我需要为每个子文件夹和命名空间手动设置路由器,这也将是非常大的。
所以我的问题是:
- 有没有办法使加载器更漂亮和更小?因为它会越来越大。
- 我如何设置路由器,这样我就不需要输入所有的命名空间和子文件夹的组合?有没有办法把它弄小一点?可以修改调度程序或任何其他类吗?或者我是否可以在路由器中设置路径变量到控制器的位置?
我已经研究了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到控制器也有一些命名空间。