我有一个很大的项目需要编程。我曾经使用CodeIgniter进行编码,但是由于他们停止维护框架,因此我决定切换到另一个框架。我选择了Phalcon框架。接下来是我要实现的应用程序的文件夹结构:
SettingsController.php
这只是应用程序文件夹结构的示例。此项目中将有很多文件夹和子文件夹,以使其易于管理。
据我了解,我需要在加载器中为每个子文件夹注册所有 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 手动设置路由器,那也将非常大。
所以我的问题是:
我研究了Phalcon文档,但找不到解决方法。
非常感谢您的任何帮助和建议。
谢谢
最佳答案
广告。 1.您可以将 namespace 更改为更多PSR-0(在我看来),所以我将做:
您可以注册一个 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/