Namespaces 可以用来避免类名的冲突,比如如果在一个应用中有两个控制器使用同样的名称,那么可以用namespace来区分他们。 另外命名空间在创建组件或者模块的时候也是非常有用的。
Using namespaces has some implications when loading the appropriate controller. To adjust the framework behavior to namespaces is necessary to perform one or all of the following tasks:
Use an autoload strategy that takes into account the namespaces, for example with Phalcon\Loader:
<?php
$loader->registerNamespaces(
array(
"Store\\Admin\\Controllers" => "../bundles/admin/controllers/",
"Store\\Admin\\Models" => "../bundles/admin/models/"
)
);
Specify it in the routes as a separate parameter in the route’s paths:
<?php
$router->add(
"/admin/users/my-profile",
array(
"namespace" => "Store\\Admin",
"controller" => "Users",
"action" => "profile"
)
);
Passing it as part of the route:
<?php
$router->add(
"/:namespace/admin/users/my-profile",
array(
"namespace" => 1,
"controller" => "Users",
"action" => "profile"
)
);
If you are only working with the same namespace for every controller in your application, then you can define a default namespace in the Dispatcher, by doing this, you don’t need to specify a full class name in the router path:
<?php
use Phalcon\Mvc\Dispatcher;
// Registering a dispatcher
$di->set('dispatcher', function () {
$dispatcher = new Dispatcher();
$dispatcher->setDefaultNamespace("Store\\Admin\\Controllers");
return $dispatcher;
});
The following example shows how to implement a controller that use namespaces:
<?php
namespace Store\Admin\Controllers;
use Phalcon\Mvc\Controller;
class UsersController extends Controller
{
public function indexAction()
{
}
public function profileAction()
{
}
}
Take the following into consideration when using models in namespaces:
<?php
namespace Store\Models;
use Phalcon\Mvc\Model;
class Robots extends Model
{
}
If models have relationships they must include the namespace too:
<?php
namespace Store\Models;
use Phalcon\Mvc\Model;
class Robots extends Model
{
public function initialize()
{
$this->hasMany(
"id",
"Store\\Models\\Parts",
"robots_id",
array(
"alias" => "parts"
)
);
}
}
In PHQL you must write the statements including namespaces:
<?php
$phql = 'SELECT r.* FROM Store\Models\Robots r JOIN Store\Models\Parts p';