我在使用Laravel4中的命名空间时遇到问题。
我们使用Laravel3构建了一个API,在其中我们创建了一个名为Components的整个命名空间目录,RESTful Laravel控制器访问它以在每个请求上执行逻辑。 Components命名空间是以这种方式创建的,以便我们可以跨多个应用程序重用逻辑来保持DRY。
在Laravel3中,在 application / start.php 文件中添加一个简单的事项:
Autoloader::namespaces(array(
'Components' => 'path\to\Components',
));
这使我们可以简单地通过
在我们的任何RESTful控制器中引用静态方法$result = Components\Services\Common::method();
在Laravel4中,它显然是一种不同的方法。我已将以下内容添加到composer.json文件
"autoload": {
"classmap": [
"app/commands",
"app/controllers",
"app/models",
"app/database/migrations",
"app/database/seeds",
"app/tests/TestCase.php"
],
"psr-0": {
"Components": "path/to/API/Components"
}
},
并运行composer dump-autoload命令将命名空间添加到 autoload_namespaces.php 文件中。
但是,我无法在Laravel4中的任何新控制器中引用命名空间。我只是在HomeController.php中找到了“Class'Component \ Services \ Common'”。
我已经检查了 autoload_real.php 文件并输出了loader变量,其中我的新命名空间列在数组的'C'元素下。但是使用它并不高兴。
我知道命名空间的工作原理与我们的Laravel3 applciation一直在使用。我宁愿不将目录复制到我们新的Laravel4应用程序中,否则我们以这种方式设计东西的原因将被否定,我们最终会维护两个代码库。命名空间目录存在于我们的Web根目录中,但不在我们的Laravel3和Laravel4应用程序之外。
感谢帮助人员
答案 0 :(得分:0)
如果您的命名空间是
Components
你的申请表在
/var/www/application
您的命名空间类位于子文件夹
中app/API
这是类文件名的一个例子:
/var/www/application/app/API/Components/Services/Common.php
然后你必须添加到你的作曲家json:
"autoload": {
"psr-0": {
"Components": "app/API"
}
},
如果您从另一个基本路径加载并且您的命名空间类位于/var/www/Components
,您可以:
"autoload": {
"psr-0": {
"Components": "/var/www"
}
},
但如果他们在/var/www/components/Components
,那么你必须
"autoload": {
"psr-0": {
"Components": "/var/www/components"
}
},
因为"Components"
是命名空间的基础,并且总是会在Composer搜索文件之前添加到路径中进行自动加载。