Silex,加载自己的类

时间:2013-03-28 11:13:29

标签: php autoload silex

我玩Silex,PHP微框架。目前我尝试加载自己的课程,但我没有运气。也许有人可以向我解释一下Silex中的加载是如何工作的?

我的项目结构如下:

app/
vendor/
web/
tests/
bootstrap.php
composer.json
composer.lock

我想说我要从Controller\User (namespace here)加载一个班级/app/MainController.php

我该怎么做?我浏览了一些文章(通过Composer或Symfony的UniversalClassLoader加载),按照一些说明进行操作,但仍无效。

如果有人可以帮我一把,我会很感激。

3 个答案:

答案 0 :(得分:12)

我假设你在bootstrap.php中加载你的Silex类:

// bootstrap.php
require_once __DIR__.'/vendor/autoload.php';

如果是,请用以下内容替换此代码:

// bootstrap.php
$loader = require __DIR__.'/vendor/autoload.php';
$loader->add(YOUR_NAMESPACE, DIRECTORY_OF_THE_NAMESPACE);

示例:

// bootstrap.php
$loader = require __DIR__.'/vendor/autoload.php';
$loader->add('Tutorial', __DIR__.'/src');

如果愿意,可以添加多个名称空间,只需为每个名称空间调用add方法即可 在src/中,您将存储您的类文件。对于每个命名空间,创建一个包含此命名空间的类文件的文件夹。 该文件应与该类名称相同。

MyNamespace \ MyClass => SRC / myNameSpace对象/ MyClass.php
MyNamespace \ SubNamespace \ SubClass => SRC / myNameSpace对象/子名字空间/ SubClass.php

在每个类文件中,您必须在第一行中设置关联的命名空间。

// src/Tutorial/DemoController.php
namespace Tutorial;
class DemoController{
// class definition goes here..
}

您现在可以在包含bootstrap.php的每个文件中访问您的类 在/app/MainController.php中,您现在可以像这样访问自己的类:

// app/MainController.php
use Tutorial\DemoController;
$foo = new DemoController();

这个解决方案对我有用。希望它适合你。

答案 1 :(得分:3)

我也在寻找相同的东西,因为Silex文档仍然有删除的registerNamespace函数。

找到了一个非常好的答案here

简而言之,您只需在 composer.json

中的“autoload”部分添加“psr-0”即可。

示例composer.json:

{
    "require": {
        "silex/silex": "~1.3",
        "doctrine/dbal": "~2.2"
    },

    "autoload": {
        "psr-0": {
            "MyApp": "src/"
        }
    }
}

确保更新Composer Autoloader(“composer install”或“c​​omposer update”)

答案 2 :(得分:2)

截至2014年10月,将您自己的类自动加载到silex中的最佳方法是使用PSR-4(而非PSR-0)使用Composer文件通过composer.json进行自动加载你的应用程序根目录:

{
    "require": {
        "silex/silex": "~2.0",
    },
    "autoload": {
        "psr-4": {"Vendor\\Namespace\\": "path/to/src/"}
    }
}

修改composer.json后,您需要执行以下操作:

composer update

在您的项目根目录上,使用终端。