如何在Symfony Bundle中包含自定义类?

8
我有一个Symfony bundle,需要使用自定义类。这个类不必在整个网站中都可访问,只需在此bundle的控制器中使用即可。 我已经看到了一些与vendors相关的解决方案,但这对我的情况来说过于繁琐,也不是必需的。 有没有更简单的解决方案?

命名空间 Acme\MyBundle\Class,使用时:use Acme\MyBundle\Class\MyClass.php。 - Carrie Kendall
2个回答

20

这就是命名空间的作用。

来自php.net

什么是命名空间?在最广泛的定义中,命名空间是一种封装项目的方法。

简单地说,只需在你的自定义类顶部包含你的命名空间。

src/Acme/DemoBundle/Model/MyClass.php

<?php 
namespace Acme\DemoBundle\Model;

class MyClass { // ...

并将其用于您的控制器:

src/Acme/SomeOtherBundle/Controller/DefaultController.php

<?php
namespace Acme\SomeOtherBundle\Controller;

// ...
use Acme\DemoBundle\Model\MyClass; # can be used in any class in any bundle
// ...

class DefaultController extends Controller { // ...

结尾的.php不是必需的,因为src/下的每个文件都会自动加载。 - Emii Khaos
这是一个天气API类,它属于“DLS\EphemerideBundle”。 - maxime
好的,那为什么不把它放在一个名为API的文件夹中呢?如果您计划拥有多个API“类别”,可以使用API/Weather。实际位置可能是src/DLS/EphemerideBundle/API/Weather.php这样的。 - Carrie Kendall
好的,我想我明白了!但是如何包含Weather.php文件以使其可以从我的控制器中访问?PHP告诉我我的类不存在:/ - maxime
请阅读我的回答中的链接。像我的示例一样正确使用命名空间将解决此问题。另外,如果您使用generate:bundle控制台命令,则可以查看正确命名空间的生成示例。如果需要更多有关如何使用它们的示例,还可以查看您的供应商文件。 - Carrie Kendall
显示剩余4条评论

7

类必须在Acme\Bundle\Model命名空间和文件夹中创建,而不是\Class!谁说的?!

// ../src/Acme/Bundle/Model/Utility.php
<?php namespace Acme\Bundle\Model;
class Utility:
..

在控制器中使用:

<?php ..
use Acme\Bundle\Model\Utility;

$x = new Utility(); // FINE!:)

文件名称(Utility.php)必须与类名相同。


显然,我说了,因为我用“Class”这个词作为例子。抱歉你被这个词卡住了,错过了示例 :) 类的实际位置与OP的问题实际上没有任何关系。 - Carrie Kendall
我明白你的意思。该死 :) - Croll

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接