我正在尝试找出如何在Lumen项目上更改默认存储位置(包括子文件夹)。由于多种原因,考虑到生产Web服务器的当前配置,Lumen在尝试编写日志或编译Blade视图时会抛出权限被拒绝的异常。
在不涉及sysadmin的情况下,唯一的选择是将存储文件夹移动到Web服务器上的tmp文件夹。
在laravel上似乎有一个名为“ useStoragePath”的方法,但是在Lumen(5.2.x)上似乎不可用。
默认路径似乎是“硬编码的”,我发现了这一点:
Project\vendor\laravel\lumen-framework\src\Application.php
/**
* Get the storage path for the application.
*
* @param string|null $path
* @return string
*/
public function storagePath($path = null)
{
return $this->basePath().'/storage'.($path ? '/'.$path : $path);
}
对于日志(相同文件):
/**
* Get the Monolog handler for the application.
*
* @return \Monolog\Handler\AbstractHandler
*/
protected function getMonologHandler()
{
return (new StreamHandler(storage_path('logs/lumen.log'), Logger::DEBUG))
->setFormatter(new LineFormatter(null, null, true, true));
}
底线:有没有牢记此限制的覆盖默认存储路径的干净方法?:
它不应涉及sysadmin(符号链接,更改权限等)。
不篡改供应商文件夹。
最佳答案
On Line 286 of vendor/laravel/lumen-framework/src/helpers.php:
if (! function_exists('storage_path')) {
/**
* Get the path to the storage folder.
*
* @param string $path
* @return string
*/
function storage_path($path = '')
{
return app()->storagePath($path);
}
}
这里的关键是这一行:
if (! function_exists('storage_path'))
这意味着如果尚未定义名为
storage_path
的函数,则Lumen将使用其自己的实现。您所要做的只是简单地编写自己的函数即可返回自己的自定义路径。
由于Lumen的规则比Laravel少得多,因此如何执行完全取决于您。也就是说,我建议通过以下方式进行操作:
在您的应用目录下放置一个名为helpers.php的文件
将所有自定义帮助程序功能添加到此文件中,包括您自己的
storage_path
实现确保在流明本身之前加载此文件。为此,您需要在作曲家的自动加载器之前放置require语句。这可以在bootstrap / app.php下的第一行完成:
require_once __DIR__ . '/../app/helpers.php';
require_once __DIR__ . '/../vendor/autoload.php';
try {
(new Dotenv\Dotenv(__DIR__ . '/../'))->load();
} catch (Dotenv\Exception\InvalidPathException $e) {
//
}
....