【发布时间】:2011-09-09 09:26:24
【问题描述】:
如何在 Symfony 1.4 中为自动加载器类功能(如 Symfony 2.0)注册命名空间(使用 PHP 5.3)?
【问题讨论】:
-
你最终能否让 Symfony 1.4 自动加载与命名空间一起工作?如果是这样,你能告诉我怎么做吗?
标签: php namespaces symfony-1.4 autoload
如何在 Symfony 1.4 中为自动加载器类功能(如 Symfony 2.0)注册命名空间(使用 PHP 5.3)?
【问题讨论】:
标签: php namespaces symfony-1.4 autoload
您可以使用Composer,这非常简单。只需将它安装在你的机器上(你可能已经在 2015 年了)并在你的项目文件夹中运行:
composer init
然后,您可以使用 composer 安装所有您想要的软件包,并在您的 ProjectConfiguration.class.php 中仅包含这一行:
require_once __DIR__.'/../vendor/autoload.php';
请注意,如果您更改了默认 Symfony1.4 目录结构,路径可能会有所不同。
【讨论】:
vendor/autoload.php 脚本。 Composer 负责映射已安装包中的命名空间,所有这些。你试过了吗?我这样做了,效果很好。
您可以在 Symfony 1.4 框架中使用来自 Symfony2 的 Autoloader。
1.将 Symfony2 类加载器复制到 Symfony 1.4 沙盒项目的供应商目录:
SF_ROOT_DIR/lib/vendor/Symfony2/src/Symfony/Component/ClassLoader/UniversalClassLoader.php
SF_ROOT_DIR/lib/vendor/Symfony2/src/Symfony/Component/ClassLoader/ApcUniversalClassLoader.php
2.修改你的 SF_ROOT_DIR/config/ProjectConfiguration.class.php 文件如下:
require_once dirname(__FILE__) . '/../lib/vendor/symfony/lib/autoload/sfCoreAutoload.class.php';
require_once dirname(__FILE__) . '/../lib/autoload/sfClassLoader.class.php';
sfCoreAutoload::register();
class ProjectConfiguration extends sfProjectConfiguration {
public function setup() {
$this->namespacesClassLoader();
$this->enablePlugins('sfDoctrinePlugin');
}
public function namespacesClassLoader() {
if (extension_loaded('apc')) {
$loader = new ApcUniversalClassLoader('S2A');
} else {
$loader = new UniversalClassLoader();
}
$loader->registerNamespaces(array(
'Pohon' => __DIR__ . '/../lib/vendor/Pohon/src'));
$loader->register();
}
}
3. 注册所需的命名空间:
例如。我要加载类:
Pohon\Tools\String\Utils\Slugify。
文件名必须是:
SF_ROOT_DIR/lib/vendor/Pohon/src/Pohon/Tools/String/Utils/Slugify.php
并注册命名空间如下:
Pohon => SF_ROOT_DIR/lib/vendor/Pohon/src
【讨论】:
use Symfony\Component\ClassLoader\UniversalClassLoader; use Symfony\Component\ClassLoader\ApcUniversalClassLoader;。此外,这里是 ClassLoader 包的链接(在这些类被弃用之前):github.com/symfony/ClassLoader/tree/2.6
Symfony 使用 spl_autoload_register() 函数来注册它自己的自动加载器 (sfAutoload)。
您可以在项目/应用程序/插件的initialize() 函数中注册自己的处理程序。 (以适用者为准)。
这也是Swift_Mailer 插件的作用:它在需要时注册自己的自动加载器。
【讨论】: