Table Of Contents

Previous topic

微应用

Next topic

事件管理

This Page

使用命名空间

Namespaces 可以用来避免类名冲突,这意味着,如果你有两个控制器,在应用程序中使用相同的名称, 可以使用命名空间来区分他们。命名空间是也可用于创建module。

Setting up the framework

使用命名空间时对加载相应控制器会有一定的影响。需要调整框架命名空间的行为,可以实现加载一个或全部:

使用自动加载的方式需要考虑命名空间的影响,以下是使用 Phalcon\Loader 的示例:

<?php

$loader->registerNamespaces(
    array(
       'Store\Admin\Controllers'    => "../bundles/admin/controllers/",
       'Store\Admin\Models'    => "../bundles/admin/models/",
    )
);

在定义路由时,控制器的路径可以指定控制器的全名称:

<?php

$router->add(
    "/admin/users/my-profile",
    array(
        "controller" => "Store\Admin\Users",
        "action"     => "profile",
    )
);

把命名空间当作路由定义的参数(详见路由器章节):

<?php

$router->add(
    "/:namespace/admin/users/my-profile",
    array(
        "namespace"  => 1,
        "controller" => "Users",
        "action"     => "profile",
    )
);

如果你只在你的应用程序中对每个控制器使用相同的命名空间,那么你可以在注册分发器时定义一个默认的命名空间,这样做的话,你就不再需要在定义路由的时候指定完整的类名称了:

<?php

//Registering a dispatcher
$di->set('dispatcher', function() {
    $dispatcher = new \Phalcon\Mvc\Dispatcher();
    $dispatcher->setDefaultNamespace('Store\Admin\Controllers\\');
    return $dispatcher;
});

Controllers with Namespaces

下面的示例演示如何实现使用命名空间来编写一个控制器:

<?php

namespace Store\Admin\Controllers;

class UsersController extends \Phalcon\Mvc\Controller
{

    public function indexAction()
    {

    }

    public function profileAction()
    {

    }

}

Models in Namespaces

对于模型,使用getSource来指定关联的数据表是非常必要的:

<?php

namespace Store\Toys;

class Robots extends \Phalcon\Mvc\Model
{

    public function getSource()
    {
        return "robots";
    }

}

另外,因为命名空间的原因,一些魔术方法不能如预期般运行,你可以按如下方式手工定义正确的行为:

<?php

namespace Store\Toys;

class Robots extends \Phalcon\Mvc\Model
{

    public function getSource()
    {
        return "robots";
    }

    public function initialize()
    {
        $this->hasMany("id", 'Store\Toys\RobotsParts', 'robots_id');
    }

    public function getRobotsParts($arguments=null)
    {
        return $this->getRelated('Store\Toys\RobotsParts', $arguments);
    }

}