好的,我做了一些测试,这些就是结果。
之所以有两个不同的结果是因为你使用的是JFactory::getApplication()。
事实上,这个方法在前端返回一个JApplicationSite 对象,而在后端返回一个JApplicationAdministrator。
这就是测试:
$app = JFactory::getApplication();
var_dump($app);
如果你在你的组件中尝试它们,你会看到上面的结果。
现在,理论上 JFactory 旨在接受参数以覆盖 std 行为并以您想要的方式实例化 Object。
我是说在“theory”方法中接受几个参数。
从文档中可以看出:
-
$id 客户端标识符或名称。
-
$config 配置设置的可选关联数组。
-
$prefix 应用前缀
不幸的是,这只是一个理论..
实际上,该方法在任何情况下都会忽略$config 和$prefix,如果self::$application 已经实例化,则$id。
猜猜看.. 不幸的是,此时self::$application 已经存在。
Murphy 会为你感到骄傲.. :)
作为管理员/index.php@39 中的第一件事,我们有:
$app = JFactory::getApplication('administrator');
因此,正如您在此处看到的那样,该方法完全忽略了此时您传递给的任何内容。
它只能用于获取 JApplicationAdministrator 的实例。
//@see libraries/joomla/factory.php@101
/**
* Get a application object.
*
* Returns the global {@link JApplicationCms} object, only creating it if it doesn't already exist.
*
* @param mixed $id A client identifier or name.
* @param array $config An optional associative array of configuration settings.
* @param string $prefix Application prefix
*
* @return JApplicationCms object
*
* @see JApplication
* @since 11.1
* @throws Exception
*/
public static function getApplication($id = null, array $config = array(), $prefix = 'J')
{
if (!self::$application)
{
if (!$id)
{
throw new Exception('Application Instantiation Error', 500);
}
self::$application = JApplicationCms::getInstance($id);
}
return self::$application;
}
顺便说一句,好消息是这个方法除了缓存和包装JApplicationCms::getInstance($id);之外没有做任何特别的事情。
因此,不要使用 JFactory::getApplication() 代替旧代码:
$menuObjects= JFactory::getApplication()->getMenu();
$menuArrays = $menuObjects ->getMenu();
你可以直接使用:
$app = JApplicationCms::getInstance('site');
$menuObjects= $app->getMenu();
$menuArrays = $menuObjects ->getMenu();
附:
是的,您可能会认为JFactory::getApplication() 的界面有点问题。