【问题标题】:Silex namespacesSilex 命名空间
【发布时间】:2015-02-23 21:34:45
【问题描述】:

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

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

我正在尝试将 HomeController 加载到 Front/Controller 文件夹中。在我的 app.php 文件中,我将控制器称为 home。

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,它可以正常工作。但是,当我转到 / 时,我得到一个错误。

ControllerResolver.php 第 153 行中的 InvalidArgumentException:

类“cms\Front\Controller\HomeController”不存在。

我已经在 composer.json 和 HomeController 中将 cms 定义为命名空间

<?php namespace cms\Front\Controller;

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

我还尝试将HomeController.php 文件直接移动到cms 目录中,将文件中的命名空间更改为cms,然后运行$app-&gt;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 上找不到任何东西。有人可以帮助我了解命名空间以及它是如何工作的吗?

【问题讨论】:

  • 我对 Silex 不熟悉,但在我脑海中,当您在 get() 方法的第二个参数前加上反斜杠时会发生什么?例如。 "\cms\Front\Controller\HomeController::index" 我想知道它是否必须是一个完全限定的名称。
  • 没什么,没什么区别。 Silex 是基于 Symphony 2 构建的,因此如果您熟悉它,它应该是相同的,或者非常相似。

标签: php namespaces silex


【解决方案1】:

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

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

在您的情况下,路径“./”应该可以工作(尚未测试),如果不是,您应该尝试将 cms 文件夹放入像 src 这样的文件夹并将路径设置为“src/”

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

【讨论】:

  • 我们去,做到了。我发现的代码使用的是 psr-0,而不是 psr-4。我将它从 0 更改为 4 并且它起作用了。谢谢。
猜你喜欢
  • 2015-08-31
  • 2015-05-26
  • 2017-09-12
  • 1970-01-01
  • 1970-01-01
  • 2011-09-05
  • 1970-01-01
  • 1970-01-01
  • 2010-10-20
相关资源
最近更新 更多