我玩Silex,PHP微框架。目前我尝试加载自己的课程,但我没有运气。也许有人可以向我解释一下Silex中的加载是如何工作的?
我的项目结构如下:
app/
vendor/
web/
tests/
bootstrap.php
composer.json
composer.lock
我想说我要从Controller\User (namespace here)
加载一个班级/app/MainController.php
。
我该怎么做?我浏览了一些文章(通过Composer或Symfony的UniversalClassLoader加载),按照一些说明进行操作,但仍无效。
如果有人可以帮我一把,我会很感激。
答案 0 :(得分: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对象/子名字空间/ 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();
这个解决方案对我有用。希望它适合你。
答案 1 :(得分:3)
我也在寻找相同的东西,因为Silex文档仍然有删除的registerNamespace函数。
找到了一个非常好的答案here
简而言之,您只需在 composer.json
中的“autoload”部分添加“psr-0”即可。示例composer.json:
{
"require": {
"silex/silex": "~1.3",
"doctrine/dbal": "~2.2"
},
"autoload": {
"psr-0": {
"MyApp": "src/"
}
}
}
确保更新Composer Autoloader(“composer install”或“composer update”)
答案 2 :(得分:2)
截至2014年10月,将您自己的类自动加载到silex中的最佳方法是使用PSR-4
(而非PSR-0
)使用Composer
文件通过composer.json
进行自动加载你的应用程序根目录:
{
"require": {
"silex/silex": "~2.0",
},
"autoload": {
"psr-4": {"Vendor\\Namespace\\": "path/to/src/"}
}
}
修改composer.json
后,您需要执行以下操作:
composer update
在您的项目根目录上,使用终端。