【问题标题】:Load automatic Class HttpFoundation\Response加载自动类 HttpFoundation\Response
【发布时间】:2014-07-28 02:03:49
【问题描述】:

我有一个控制器:

<?php
namespace Acme\HelloBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
//use Symfony\Component\HttpFoundation\Response;
class HelloController extends Controller
{
    public function indexAction($name)
    {
        return new Response('<html><body>Hello '.$name.'!</body></html>');
    }
}

当我运行驱动程序时返回错误

1/1 ClassNotFoundException:试图从 命名空间“Acme\HelloBundle\Controller”在 D:\symfony2\src\Acme\HelloBundle\Controller\HelloController.php 行 14. 你需要从另一个命名空间“使用”它吗?也许您需要为以下之一添加 use 语句: Symfony\Component\BrowserKit\Response, Symfony\Component\HttpFoundation\Response, Doctrine\CouchDB\HTTP\Response.

因为我可以加载“使用 Symfony\Component\HttpFoundation\Response;”我所有控制器的类,而无需将其包含在每个控制器中

请帮忙,自动加载 HttpFoundation\Response

谢谢

【问题讨论】:

  • 你需要使用声明。就像 php 命名空间的工作方式一样。除非你想返回 new Symfony\Component\HttpFoundation\Response() 但这并不理想。

标签: php symfony


【解决方案1】:

当您使用 use 语句时,您不包括包含该类的文件,您正在对命名空间进行别名/导入。

你像这样导入命名空间:

use Symfony\Bundle\FrameworkBundle\Controller\Controller;

或者你可以给一个类起别名,例如 Response 类可以别名为 SymfonyResponse:

use Symfony\Component\HttpFoundation\Response as SymfonyResponse;

然后你可以在你的代码中使用新的别名:

return new SymfonyResponse('<html><body>Hello '.$name.'!</body></html>');

如果你不导入类命名空间,自动加载器会认为你正在尝试在当前命名空间中加载一个响应类:Acme\HelloBundle\Controller,它不存在。

现在,如果您不想在文件顶部添加 use 语句,请使用完全限定名称:

return new \Symfony\Component\HttpFoundation\Response('<html><body>Hello '.$name.'!</body></html>');

我个人建议不要这样做,因为它可能会变得疯狂,具体取决于您使用的类的数量......只需添加 use 语句。一些 IDE 会自动为您添加它(例如 PHPStorm)。

有关详细信息,请参阅

  1. Using namespaces: Aliasing/Importing
  2. How to use namespaces, part 1: the basics
  3. How to Use PHP Namespaces, Part 2: Importing, Aliases, and Name Resolution
  4. Composer namespaces in 5 minutes

【讨论】:

    【解决方案2】:

    按照错误消息中的说明执行操作。取消注释将 Request 类导入当前命名空间的 use 语句,让自动加载器开始工作。

    use 语句不会触发自动加载,只有在执行代码中引用了该类时才会包含该文件。

    【讨论】:

    • 在书 Symfony2 中没有把这个类放在控制器中然后我把类自动加载“HttpFoundation\Response”放在哪里??谢谢
    • 我想使用“HttpFoundation\Response”类而不包含在任何控制器中,我想要的是自动加载所有捆绑器的所有控制器
    • 包含是什么意思?你指的是use声明吗?你可以在任何你想要的地方使用这个类,只要 php 可以解析正确的命名空间。
    猜你喜欢
    • 2020-01-02
    • 1970-01-01
    • 2017-09-21
    • 1970-01-01
    • 1970-01-01
    • 2015-03-17
    • 2015-09-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多