使用 Symfony 1.4 的自动加载器加载命名空间类?
Posted
技术标签:
【中文标题】使用 Symfony 1.4 的自动加载器加载命名空间类?【英文标题】:Loading namespaced classes with Symfony 1.4's autoloader? 【发布时间】:2011-09-09 09:26:24 【问题描述】:如何在 Symfony 1.4 中为自动加载器类功能(如 Symfony 2.0)注册命名空间(使用 php 5.3)?
【问题讨论】:
你最终能否让 Symfony 1.4 自动加载与命名空间一起工作?如果是这样,你能告诉我怎么做吗? 【参考方案1】:您可以使用Composer,这非常简单。只需将它安装在你的机器上(你可能已经在 2015 年了)并在你的项目文件夹中运行:
composer init
然后,您可以使用 composer 安装所有您想要的软件包,并在您的 ProjectConfiguration.class.php
中仅包含这一行:
require_once __DIR__.'/../vendor/autoload.php';
请注意,如果您更改了默认 Symfony1.4 目录结构,路径可能会有所不同。
【讨论】:
Symfony 1.4 不知道如何在命名空间中加载类,你必须实现这个特性。 Composer 只是一个包/库管理器。 Composer 也提供了一个 ClassLoader,当您安装(使用 Composer 俚语“require”)包时,您所要做的就是包含上面的vendor/autoload.php
脚本。 Composer 负责映射已安装包中的命名空间,所有这些。你试过了吗?我这样做了,效果很好。
感谢您为我提供的解决方案。您需要指定 vendor-dir: "lib/vendor" 以在 sf 1.4 的原始供应商目录中拥有库;将它用于 amp-library,它工作正常。【参考方案2】:
您可以在 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
【讨论】:
Autoloader 项目可以在这里找到:github.com/Symfony-Plugins/sfClassLoaderPlugin. 漂亮,谢谢!我必须在 ProjectConfiguraration.class.php 文件中的导入之后添加use Symfony\Component\ClassLoader\UniversalClassLoader; use Symfony\Component\ClassLoader\ApcUniversalClassLoader;
。此外,这里是 ClassLoader 包的链接(在这些类被弃用之前):github.com/symfony/ClassLoader/tree/2.6【参考方案3】:
Symfony 使用 spl_autoload_register()
函数来注册它自己的自动加载器 (sfAutoload
)。
您可以在项目/应用程序/插件的initialize()
函数中注册自己的处理程序。 (以适用者为准)。
这也是Swift_Mailer
插件的作用:它在需要时注册自己的自动加载器。
【讨论】:
以上是关于使用 Symfony 1.4 的自动加载器加载命名空间类?的主要内容,如果未能解决你的问题,请参考以下文章