PHP Class 作曲家未自动加载或至少未找到
PHP Class not being autoloaded by composer or at leas it is not found
我正在启动一个 lumen 项目,但我遇到了命名空间和自动加载的问题。
在我的项目根目录中的 composer.json 文件中,它声明如下:
"autoload": {
"classmap": [
"database/seeds",
"database/factories"
],
"psr-4": {
"App\": "app/"
}
},
在根目录中,我们有以下目录结构(以及其他):
./app/
-> Common/TokenFactory.php
-> Http/
-> Controllers/UserController.php
TokenFactory.php 包含以下非常简单的代码:
<? php
namespace App\Common;
class TokenFactory
{
public function generateToken($tokenLength = 40)
{
$length_div = round($tokenLength/2, 0, PHP_ROUND_HALF_DOWN);
return bin2hex(openssl_random_pseudo_bytes($length_div));
}
}
?>
我希望在 UserController.php 文件中使用这个 class,我有以下代码:
<?php
namespace App\Http\Controllers;
use App\User;
use Illuminate\Http\Request;
use App\Common\TokenFactory;
class UserController extends Controller
{
.............
但是当我尝试在 UserController class 中实例化 TokenFactory 时,我收到错误消息:
Class 'App\Common\TokenFactory' Not foud.
我做错了什么?我自己创建了 Common 目录,但我的理解是 Autoloader 应该能够使用命名空间定义来根据需要定位和加载文件。
我已经为此苦苦挣扎了很长一段时间,任何建议将不胜感激。
补充说明:
我注意到在调用该服务时,虽然我收到 class 未找到的消息,但文件的内容显示在错误消息中,这意味着它以某种方式定位和加载文件但无法识别class 在使用 use 子句的文件中调用它时。见下图。
首先,我要删除 TokenFactory 末尾的结束 PHP-Tag“?>”。
之后我建议在你的控制器中要求每个手都有 TokenFactory-File:如果你这样做是否有效?
我们发现在这种情况下,一个小的拼写错误是罪魁祸首。不幸的是,这种情况时有发生。我会说命令行 php 确实有一个语法 checker/linter 可以提供帮助,如果你的编辑器或 IDE 错过了这样的东西。
php -l myscript.php
它过去曾帮助过我几次。
在这种情况下,问题是:
<? php
namespace App\Common;
class TokenFactory
{
开始标签需要 <?php
我正在启动一个 lumen 项目,但我遇到了命名空间和自动加载的问题。 在我的项目根目录中的 composer.json 文件中,它声明如下:
"autoload": {
"classmap": [
"database/seeds",
"database/factories"
],
"psr-4": {
"App\": "app/"
}
},
在根目录中,我们有以下目录结构(以及其他):
./app/
-> Common/TokenFactory.php
-> Http/
-> Controllers/UserController.php
TokenFactory.php 包含以下非常简单的代码:
<? php
namespace App\Common;
class TokenFactory
{
public function generateToken($tokenLength = 40)
{
$length_div = round($tokenLength/2, 0, PHP_ROUND_HALF_DOWN);
return bin2hex(openssl_random_pseudo_bytes($length_div));
}
}
?>
我希望在 UserController.php 文件中使用这个 class,我有以下代码:
<?php
namespace App\Http\Controllers;
use App\User;
use Illuminate\Http\Request;
use App\Common\TokenFactory;
class UserController extends Controller
{
.............
但是当我尝试在 UserController class 中实例化 TokenFactory 时,我收到错误消息:
Class 'App\Common\TokenFactory' Not foud.
我做错了什么?我自己创建了 Common 目录,但我的理解是 Autoloader 应该能够使用命名空间定义来根据需要定位和加载文件。 我已经为此苦苦挣扎了很长一段时间,任何建议将不胜感激。
补充说明:
我注意到在调用该服务时,虽然我收到 class 未找到的消息,但文件的内容显示在错误消息中,这意味着它以某种方式定位和加载文件但无法识别class 在使用 use 子句的文件中调用它时。见下图。
首先,我要删除 TokenFactory 末尾的结束 PHP-Tag“?>”。
之后我建议在你的控制器中要求每个手都有 TokenFactory-File:如果你这样做是否有效?
我们发现在这种情况下,一个小的拼写错误是罪魁祸首。不幸的是,这种情况时有发生。我会说命令行 php 确实有一个语法 checker/linter 可以提供帮助,如果你的编辑器或 IDE 错过了这样的东西。
php -l myscript.php
它过去曾帮助过我几次。
在这种情况下,问题是:
<? php
namespace App\Common;
class TokenFactory
{
开始标签需要 <?php