命名空间¶
概览¶
命名空间可以用于避免类名冲突。这意味着如果你在一个应用程序中有两个同名的控制器,可以使用命名空间来帮助 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
{
public function initialize()
{
$this->hasMany(
'inv_cst_id',
Customers::class,
'cst_id',
[
'alias' => 'customers',
]
);
}
}
在 PHQL 中,你必须在语句中包含命名空间: