4

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

我的项目结构如下所示:

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

假设我想Controller\User (namespace here)/app/MainController.php.

我怎样才能做到这一点?我浏览了一些文章(通过 Composer 或 Symfony 的 UniversalClassLoader 加载),遵循了一些说明,但仍然无法正常工作。

如果有人可以帮我一把,我将不胜感激。

4

3 回答 3

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/SubNamespace/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();

这个解决方案对我有用。希望对你有效。

于 2013-04-10T12:10:44.977 回答
3

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

在这里找到了一个非常好的答案

简而言之,您所要做的就是在composer.json的“autoload”部分添加一个“psr-0”

示例作曲家.json:

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

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

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

于 2015-07-02T12:31:00.963 回答
2

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

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

编辑您的后composer.json,您需要执行以下操作:

composer update

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

于 2016-06-14T11:20:55.647 回答