跳转到内容

命名空间


概览

命名空间可以用于避免类名冲突。这意味着如果你在一个应用程序中有两个同名的控制器,可以使用命名空间来帮助 PHP 理解它们是两个不同的类。命名空间在创建捆绑包或模块时也非常有用。

激活

如果你决定为你的应用程序使用命名空间,你需要告诉自动加载器你的命名空间位于何处。这是在应用程序中区分命名空间的最常见方法。如果你选择使用Phalcon\Autoload\Loader组件,则需要相应地注册你的命名空间:

<?php

$loader->registerNamespaces(
    [
       'MyApp\Admin\Controllers' => '/app/web/admin/controllers/',
       'MyApp\Admin\Models'      => '/app/web/admin/models/',
    ]
);

在定义路由时,也可以指定命名空间,使用路由器组件:

<?php

$router->add(
    '/admin/invoices/list',
    [
        'namespace'  => 'MyApp\Admin',
        'controller' => 'Invoices',
        'action'     => 'list',
    ]
);

或者将其作为路由的一部分作为参数传递

<?php

$router->add(
    '/:namespace/invoices/list',
    [
        'namespace'  => 1,
        'controller' => 'Invoices',
        'action'     => 'list',
    ]
);

最后,如果你只为每个控制器使用相同的命名空间,可以在你的分派器中定义默认命名空间。这样做后,你将不需要在路由器路径中指定完整的类名:

<?php

use Phalcon\Mvc\Dispatcher;

$di->set(
    'dispatcher',
    function () {
        $dispatcher = new Dispatcher();

        $dispatcher->setDefaultNamespace(
            'MyApp\Admin\Controllers'
        );

        return $dispatcher;
    }
);

控制器

下面的例子展示了如何实现一个使用命名空间的控制器:

<?php

namespace MyApp\Admin\Controllers;

use Phalcon\Mvc\Controller;

class InvoicesController extends Controller
{
    public function indexAction()
    {

    }

    public function listAction()
    {

    }
}

模型

下面的例子展示了一个带有命名空间的模型:

<?php

namespace MyApp\Admin\Models;

use Phalcon\Mvc\Model;

class Invoices extends Model
{

}

如果模型之间有关系,它们也必须包含命名空间:

<?php

namespace MyApp\Admin\Models;

use Phalcon\Mvc\Model;

class Invoices extends Model
{
    public function initialize()
    {
        $this->hasMany(
            'inv_cst_id',
            Customers::class,
            'cst_id',
            [
                'alias' => 'customers',
            ]
        );
    }
}

在 PHQL 中,你必须在语句中包含命名空间:

<?php

$phql = 'SELECT i.* '
      . 'FROM MyApp\Admin\Models\Invoices i '
      . 'JOIN MyApp\Admin\Models\Customers c';
无噪 Logo
无噪文档
25 年 6 月翻译
文档源↗