ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[TOC] # 使用命名空间 [命名空间](http://php.net/manual/en/language.namespaces.php) 可用于避免类名冲突;这意味着如果在具有相同名称的应用程序中有两个控制器,则可以使用命名空间来区分它们。命名空间对于创建包或模块也很有用。 ## 建立框架 在加载适当的控制器时,使用命名空间会有一些影响。要调整框架行为以命名空间,必须执行以下一项或所有任务: 使用考虑名称空间的自动加载策略,例如使用`Phalcon\Loader`: ```php <?php $loader->registerNamespaces( [ 'Store\Admin\Controllers' => '../bundles/admin/controllers/', 'Store\Admin\Models' => '../bundles/admin/models/', ] ); ``` 在路由中将其指定为路径路径中的单独参数: ```php <?php $router->add( '/admin/users/my-profile', [ 'namespace' => 'Store\Admin', 'controller' => 'Users', 'action' => 'profile', ] ); ``` 将其作为路由的一部分传递: ```php <?php $router->add( '/:namespace/admin/users/my-profile', [ 'namespace' => 1, 'controller' => 'Users', 'action' => 'profile', ] ); ``` 如果您只为应用程序中的每个控制器使用相同的命名空间,则可以在Dispatcher中定义默认命名空间,通过这样做,您不需要在路由器路径中指定完整的类名: ```php <?php use Phalcon\Mvc\Dispatcher; // 注册调度器 $di->set( 'dispatcher', function () { $dispatcher = new Dispatcher(); $dispatcher->setDefaultNamespace( 'Store\Admin\Controllers' ); return $dispatcher; } ); ``` ## 命名空间中的控制器 以下示例显示如何实现使用名称空间的控制器: ```php <?php namespace Store\Admin\Controllers; use Phalcon\Mvc\Controller; class UsersController extends Controller { public function indexAction() { } public function profileAction() { } } ``` ## 命名空间中的模型 在命名空间中使用模型时,请考虑以下因素: ```php <?php namespace Store\Models; use Phalcon\Mvc\Model; class Robots extends Model { } ``` 如果模型有关系,它们也必须包含命名空间: ```php <?php namespace Store\Models; use Phalcon\Mvc\Model; class Robots extends Model { public function initialize() { $this->hasMany( 'id', 'Store\Models\Parts', 'robots_id', [ 'alias' => 'parts', ] ); } } ``` 在PHQL中,您必须编写包含名称空间的语句: ```php <?php $phql = 'SELECT r.* FROM Store\Models\Robots r JOIN Store\Models\Parts p'; ```