Silex 命名空间

Silex namespaces

我对命名空间还是很陌生,很难理解如何使用它们。我正在使用 Silex Microframework 并尝试设置我的文件夹结构。到目前为止我有:

cms/
  ACP/
    Controller/
      HomeController.php
    View/
  Front/
    Controller/
      HomeController.php
    View/
      Template/
        page.php
      home.php
  app.php
  bootstrap.php

我正在尝试加载 Front/Controller 文件夹中的 HomeController。在我的 app.php 文件中,我正在调用家庭控制器。

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

$app = new Silex\Application();
$app['debug'] = true;

$app->get("/", "cms\Front\Controller\HomeController::index");
$app->get('/test', function() {
    return new Symfony\Component\HttpFoundation\Response("Test successful");
});

return $app;

如果我在浏览器中转到 /test,它工作正常。但是,当我转到 / 时出现错误。

InvalidArgumentException in ControllerResolver.php line 153:

Class "cms\Front\Controller\HomeController" does not exist.

我在 composer.json 中将 cms 定义为命名空间,在 HomeController 中我有

<?php namespace cms\Front\Controller;

class HomeController {
    
    public function index() {
        return "Hello World, I'm the front page!";
    }
    
}

我也试过将 HomeController.php 文件直接移动到 cms 目录,将文件中的名称空间更改为 cms 然后 运行 $app->get("/", "cms\HomeController::index"); 但它仍然不起作用。我得到了不存在的相同错误。

这是我的作曲文件:

{
    "require": {
        "silex/silex": "~1.1",
        // ...other requirements
    },
    "require-dev": {
        "symfony/var-dumper": "dev-master"
    },
    "autoload": {
        "psr-0": {
            "cms": "cms/"
        }
    }
}

我需要做什么才能让它正常工作?我似乎无法在 Silex 站点或 Google 上找到任何内容。有人可以帮助我了解命名空间及其工作原理吗?

您需要将源文件夹添加到 composer 自动加载中 (https://getcomposer.org/doc/01-basic-usage.md#autoloading)

"autoload": {
    "psr-4": {"Acme\": "./"}
}

在您的情况下,路径“./”应该有效(尚未测试),否则您应该尝试将 cms 文件夹放入 src 之类的文件夹并将路径设置为 "src/"

记得要运行composer dump-autoload重新生成autoload.php