【问题标题】:Include a file in laravel controller?在 laravel 控制器中包含文件?
【发布时间】:2015-09-03 17:33:40
【问题描述】:

我正在创建一个项目,它以 .php 文件 API 的形式提供了一些附加功能,其中包含一些函数和一些类(其中一些类名与 Laravel 内置的类名冲突)所以,我的问题应该如何我将此文件包含在我的 Laravel 控制器中以调用文件中的函数,这些函数使用文件的类而不引用 Laravel 类并且在 .php API 文件中进行较少或没有修改?

注意*我使用的是 Laravel-5.1

【问题讨论】:

  • 类名冲突是什么意思?从 PHP 5.3 开始,只要它们位于不同的命名空间中,就可以拥有具有相同名称的类。
  • @jedrzej.kurylo 该文件包含与 Laravel 响应类冲突的响应类和更多类
  • 可以,但是响应类在 Illuminate\Http 命名空间中吗?
  • @jedrzej.kurylo 没有同一个文件中的所有类和函数,只有名称冲突。
  • 好的,然后在下面的答案中包含文件和类名的别名。您只需为您在控制器中使用的那些设置别名。

标签: php laravel laravel-5 laravel-5.1


【解决方案1】:

如果您有一个包含一些需要为每个请求加载的类/函数的自定义文件,您需要确保将其添加到自动加载器中。

在您的 composer.json 中,在 autoload 部分添加以下内容:

"autoload": {
  "files": [
    "path/to/your/File.php"
  ]
}

这将确保文件已加载。现在你需要的是一种在不与现有 Laravel 类冲突的情况下使用这些类的方法。

首先,确保您在包含文件的顶部有一个命名空间声明 - 比如说 namespace Your\Namespace。为了避免冲突,您需要在代码中引用它时明确告诉 PHP 您指的是哪个类。您提到您的文件包含 Laravel 中也存在的 Response 类。为了能够同时使用两者,您需要为其中之一设置别名:

use Illuminate\Http\Response as LaravelResponse;
use Your\Namespace\Response;

现在在您的代码中,您可以将 Laravel 的 Response 类称为 LaravelResponse,而您的响应则只需 Response

文件的位置无关紧要,只要它位于 Laravel 可访问的文件夹中,并且其补丁已添加到 composer.json

请记住,不鼓励在每个文件中存储多个类,这是一种不好的做法。我强烈建议您将罚款拆分为每个类的单独文件 + 一个具有全局函数的附加文件。

【讨论】:

  • 文件的位置不相关,它也可以在 laravel 的文件夹之外,但你需要更新 composer - 并添加文件夹的路径
【解决方案2】:

创建别名

例如

use App\Http\Requests\Request as DifferentRequest;

DifferentRequest->doStuff();

Aliasing/Importing

【讨论】:

  • 但是如果我想将它与 Laravel 合并以及如何将它与 Laravel 合并,我应该将文件保存在哪里?
【解决方案3】:

建议使用@user2504370 的别名,

添加到作曲家:

"autoload": {
    "classmap": [
        "database",
        "place_with_your_file",
    ],
    "psr-4": {
        "App\\": "app/",
        "your_namespace": "your path",
    }
},

然后运行

composer dump-autoload

编辑: 类图中有一个错字。我想告诉您,您可以随时放置文件,例如,您可以创建一个新文件夹“place_with_your_file”,它不一定在 Laravel 的文件夹中。

我将它与我的外部库一起使用。

对于 PSR-4:如果您使用命名空间,那么您将在此处注册基本命名空间和可以找到的文件夹:

例如:"Utilities\\": "../utilities/app"

或者你的路径是什么。

对于类映射,您需要包含此文件夹的路径:

"../utilities/app"

您的自动加载将如下所示:

   "autoload": {
        "classmap": [
            "database",
            "../utilities/app",
        ],
        "psr-4": {
            "App\\": "app/",
            "Utilities\\": "../utilities/app"`
        }
    },

【讨论】:

  • 这行不通,因为 PSR-4 要求每个类都位于与其包含的类同名的单独文件中。这里 OP 有一个文件,其中包含多个类和全局函数。
  • 其实不是这样,是注册你使用的命名空间
  • 来自 PSR-4 规范的第 3.1 点:“终止类名对应于以 .php 结尾的文件名。文件名必须匹配终止类名的大小写。” -php-fig.org/psr/psr-4。它正在为命名空间注册一个基本文件夹,但如果您尝试使用此空间中的类,自动加载器将尝试加载具有该类名称的文件。只有当您使用与文件名匹配的类名时才会加载该文件 - 它不会自动加载,当您尝试使用该文件中的某些全局函数时也不会加载。
  • @jedrzej.kurylo 我不知道你在说什么,我在我的自动加载类映射中发现了一个错字,所以我扩展了我的解释,让它更清楚。并且在我所有的应用程序上都能完美运行 :) 你的解释对我来说不是很清楚,但是谢谢。
【解决方案4】:

感谢大家努力解决我的问题,但没有一个解决方案对我有用,所以这是我为我的问题尝试的方法

下面是我想要包含/集成的 php 文件的结构

<?php

class Misc {

    const SUCCESS = 1;
    const FAILURE = 0;

    public static function get_hash ( $key )
    {
        ...
        ...
        ...
    }

    public static function show_reponse ( $result )
    {
        ...
    }

}

function check($keyhash) 
{
    ...
    ...
    ...
}

function function2() 
{
    ...
    ...
    ...
}

class Response {

    public function __construct ( $key )
    {
        ...
    }

    public function __destruct ()
    {
        unset( $this->key );
        unset( $this->params );
    }

    public function __set ( $key)
    {
        ...
    }

    public function __get ( $key )
    {
        return $this->params[$key];
    }

    private function check_now ()
    {
        ...
    }
}

我面临的主要问题是类名 Response 与 Laravel Response 类冲突,所以我只是从文件中删除了所有类,并移至 Laravel\App 文件夹中的新文件夹中的各个文件,然后为所有类添加了命名空间。

然后我把所有函数都移到了laravel\App目录下的一个PHP文件中

并使用类名和定义的命名空间,因为我将所有函数移动到不同的 PHP 文件中,我可以轻松调用函数

这是我最终的 Laravel 文件夹结构

Laravel

  -App
    -Console
    -Events
    -Exceptions
    -...
    -Libraries(Folder Containing Individual PHP files of classes from original file)
    -Providers
    -helpers.php(File containing all functions from original file)
    -User.php
  -bootstrap
  -...
  -...

【讨论】:

    猜你喜欢
    • 2018-09-25
    • 1970-01-01
    • 2014-10-30
    • 1970-01-01
    • 2018-09-15
    • 1970-01-01
    • 2013-08-20
    • 1970-01-01
    • 2014-12-27
    相关资源
    最近更新 更多