Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 未找到Laravel/Lumen自定义类_Php_Laravel_Composer Php_Laravel 5.1_Lumen - Fatal编程技术网

Php 未找到Laravel/Lumen自定义类

Php 未找到Laravel/Lumen自定义类,php,laravel,composer-php,laravel-5.1,lumen,Php,Laravel,Composer Php,Laravel 5.1,Lumen,我在尝试使用Laravel的微框架Lumen中的自定义命名空间类时遇到了一个问题。尝试实例化该类时,我遇到了一个找不到的类错误 相对目录: |--- app | |---Classes | | |--- GetImages.php < My custom, namespaced class |--- Http |--- |--- routes.php < Using the class here works | |--- Processors | |

我在尝试使用Laravel的微框架Lumen中的自定义命名空间类时遇到了一个问题。尝试实例化该类时,我遇到了一个
找不到的类
错误

相对目录:

|--- app
|    |---Classes
|    |   |--- GetImages.php < My custom, namespaced class
|--- Http
|--- |--- routes.php < Using the class here works
|    |--- Processors
|    |    |--- get.php < Using the class here does not work, generates the error (listed below)
出现错误的get.php文件:

use App\Classes\GetImages;

$n = new GetImages;
return $n->name;
如果我在主页中发出
ajax
请求,比如
$.get('http://www.example.com/app/Http/Processors/get.php“)
我收到以下错误:

Fatal error: Class 'App\Classes\GetImages' not found in http://www.example.com/app/Http/Processors/get.php on line 5.
但是,如上所述,如果我在
routes.php
文件中实例化这个类,它会正常工作

composer.json
自动加载部分:

"autoload": {
    "psr-4": {
        "App\\": "app/"
    },
    "classmap": [
        "database/"
    ],
    "files": [
        "app/Http/helpers.php"
    ]
}

我觉得这是一个自动加载问题,但我已经完成了
composer dumpautoload-o
composer update
,并遵循了
PSR-4
标准,没有任何更改。你知道我遗漏了什么吗?

如果你运行
http://www.example.com/app/Http/Processors/get.php
而您的整个
get.php
文件内容如下所示:

use App\Classes\GetImages;

$n = new GetImages;
return $n->name;
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use MyCompany\MyCodeLibrary\Calculator;


class TestController extends Controller
{
  public $calculator;
  public function __construct() {
    $this->calculator = new Calculator();
  }

  public function doSomething() {
    $this->calculator->something();
  }

  ...

}
它将不起作用,因为类为的文件尚未加载。事实上,这个文件与Laravel/Lumen没有任何共同之处,它只是一个简单的PHP文件。当您使用framework时,它使用Composer autoloader加载有效文件;当您使用simple file时,您需要手动包含autoloader或必要的文件

您有3种选择:

  • 为该操作创建路由,并在控制器中执行所需操作
  • 在文件开头添加
    require'/vendor/autoload.php'(具有自动加载文件的有效路径
  • 手动要求
    GetImages
    class
    require'app/Classes/GetImages.php';

当您使用框架而不使用独立的PHP文件来完成此工作时,最好的选择可能是第一个。

您向此URL发出AJAX请求:
$.get('http://www.example.com/app/Http/Processors/get.php)

如果这真的从PHP得到了答案,那么您就绕过了整个框架,在设置它时犯了一个很大的错误

每个静态资产都应该属于您选择的适当子目录中的
public
文件夹(图像可能进入
public/img
等)

还应该有一个文件
public/index.php
,该文件应该可以获取
public
中某个地方不是现有文件的每个请求。这需要正确配置web服务器,即Apache web服务器通常会获得一个.htaccess文件(如果无法将内容添加到vhost中)这会导致URL重写

index.php
将引导Composer的自动加载,然后初始化框架并将当前请求传递给它进行处理。路由将找到相关的控制器,该控制器将执行一些奇特的数据处理,并返回结果(以呈现模板、JSON数据或任何其他形式)

这意味着您应该使用的URL将永远不会与实际存在的文件的路径名相同。但这就是您所做的:
app/Http/Processors/get.php
是直接访问的。这是一个巨大的安全漏洞,因为所有框架都假定唯一可公开访问的文件夹是
public
文件夹。您正在公开一个更高的目录级别,并且每个人都可以访问任何文件(如果他知道该文件的名称,或者如果您的web服务器创建了目录列表)。这可能会公开带有敏感密码的配置文件

而且它还会破坏Ajax请求中的脚本,因为现在您必须再次执行所有初始化工作


创建一个控制器是不够的,您还必须修复一般的配置。

我通过为自定义类的名称空间和在composer.json文件中可以找到它们的目录添加一个PS4条目来实现它,如下所示:

"autoload": {
    "psr-4": {
        "App\\": "app/",
        "MyCompany\\MyCodeLibrary\\": "MyCodeLibrary/"
    },
    "classmap": [
        "database/"
    ]
},
然后在项目根目录中(包含
app
目录的同一目录)创建我的
MyCodeLibrary
目录

然后我只需要运行:

$composer转储自动加载-o

现在,在
mycdelibrary
目录中,我添加了我想要的任何类。例如,我添加了一个类调用
Calculator.php
。我在
mycdelibrary
中创建了它

文件
mycdelibrary/Calculator.php
内部看起来像这样(请注意,我可以使用Lumen
app()
config()
helper方法来加载我的自定义配置文件(或进行数据库查询等其他操作):


谢谢你的解释。需要
autoload.php
实际上解决了这个问题。我会按照建议使用第一个选项来解决它,因为我知道你说它更好是什么意思。再次感谢!你没有向我们展示
composer.json
@Sven的自动加载部分。我现在已经更新并包括了这个部分。你收费吗l有一种比下面提供的答案更合适的方法来处理这个问题?这非常有用,谢谢。我安装这个只是为了了解更多关于使用框架的信息,似乎你对公众访问
public
以外的文件是正确的。我将回顾我安装它的方式,并使用你的解释阿纳蒂翁,我想我能理解这为什么如此危险。再次感谢你的帮助。
<?php
namespace MyCompany\MyCodeLibrary;

class Calculator {

  public $app_settings;

  public __construct() {
    // load custom config files
    app()->configure('my-app-settings');
    $this->app_settings = config('my-app-settings');
  }

  ...
  // other custom class methods
  ...
}
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use MyCompany\MyCodeLibrary\Calculator;


class TestController extends Controller
{
  public $calculator;
  public function __construct() {
    $this->calculator = new Calculator();
  }

  public function doSomething() {
    $this->calculator->something();
  }

  ...

}