【问题标题】:Laravel - Read file from workbench/vendor packageLaravel - 从工作台/供应商包中读取文件
【发布时间】:2014-10-01 14:18:28
【问题描述】:

我正在为 laravel4 开发一个包,我需要读入一个 csv 文件。我一直无法找到获取文件路径的方法。

我尝试过这样做:

$file = File::get('data/myfile.csv');

然而,这似乎是相对于 laravel 应用程序的根路径而不是包。

我可以使用app_path() 并手动添加工作台/供应商文件夹,但这并不理想。我也不希望文件“发布”到主应用程序,它需要保留在包文件夹中。

在我的 ServiceProvider 中,我似乎可以使用 $this->guessPackagePath(),它为我提供了路径,但这不适用于控制器。

如何获取包的路径以便读取此文件?

【问题讨论】:

  • 我开发包的经验为零,但是如果您创建了一个自定义配置值来指定您的包相对于app_path 的位置,该怎么办?发布它,然后您可以调用自定义配置,如Config::get('package.value')。就像我说的,我可能会离开这里,但这至少可以让你从任何地方获取包路径。
  • 不幸的是,它需要自动确定这一点。如果一个包是通过 composer 安装的,它不应该要求用户将路径添加到配置文件中。肯定有办法确定路径,就是找不到。

标签: laravel laravel-4


【解决方案1】:

我找到了一个有效的解决方案,虽然不是我想要的,但它达到了它的目的。

这就是我的文件夹结构:

workbench
    - vendorname
      - appname
        - src
            - controllers
                - mycontroller.php
            - data
                - myfile.csv

在 mycontroller.php 中,我可以访问 csv 文件,如下所示:

$path = dirname(dirname(__FILE__)) . '/data/';
$contents = File::get($path . 'myfile.csv');

dirname 被使用两次以获取父文件夹。

通过使用__FILE__,它可以保持相对于脚本所在位置的路径。这意味着我是在工作台中处理它,还是将它发布到供应商文件夹,或者是否重命名了任何父文件夹 - csv 文件的路径仍然有效。

【讨论】:

  • __DIR__ 将为您提供目录名称,从而节省您对dirname 的一次调用。
  • 你可以刚刚完成__DIR__ . '/../data/myfile.csv';
【解决方案2】:

这是我在 Testbench TestCase 类中遇到的一个例程:

protected function getPackagePath()
{
    return realpath( implode( DIRECTORY_SEPARATOR, [
        __DIR__,
        '..',
        'src',
        'MyPackage'
    ] ) );
}

【讨论】:

    猜你喜欢
    • 2014-01-10
    • 2013-07-17
    • 1970-01-01
    • 2018-10-15
    • 2016-12-10
    • 2017-12-14
    • 1970-01-01
    • 2016-04-11
    • 2017-05-05
    相关资源
    最近更新 更多