我的AppServiceProvider.php文件中有以下代码:

<?php

namespace App\Providers;

use App\Models\Setting;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Config;
use Illuminate\Support\Facades\Schema;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {        
        if (Schema::hasTable('settings')) {
            foreach (Setting::all() as $setting) {
                Config::set('settings.'.$setting->key, $setting->value);
            }
        }
    }
}

它在本地运行得很好,但当我通过DeployHQ部署时,它终止了该进程,并显示以下错误:

SQLSTATE[HY000][2002]没有这样的文件或目录(SQL:SELECT*FROM INFORMATION_SCHEMA_TABLES其中TABLE_SCHEMA=Giga和TABLE_NAME= 设置和TABLE_TYPE=‘基表’)

这在某种程度上是有道理的,因为构建服务器上不存在数据库,所以判断无法运行,因为没有要判断的内容.有没有一种不同的方法,在 bootstrap 时用数据库中的值对settings配置进行加密,而不会影响php artisan package:discover的运行?

我知道这可能会被问到,但是.env文件等都设置正确了.这个问题与构建服务器没有数据库有关,但文件通过管道传输到的服务器有数据库.

编辑: 为了给出更多的上下文,也许可以给出一些建议,我只是在Service类的代码中真正使用了这个配置值:

public function __construct()
{
    $this->domain = config('api.domain');
    $this->apiVersion = config('api.version');
    $this->bearerToken = config('settings.bearer_token');
    $this->clientId = config('api.client_id');
    $this->clientSecret = config('api.client_secret');
}

所有在线内容都建议将这些值放到配置中,然而,如果只在这里调用它,那么直接从数据库检索它是否可以?

推荐答案

问题是,当构建服务器上不存在数据库中的"设置"表时,代码试图访问该表.处理此问题的一种方法是在运行访问数据库的代码之前判断应用程序是否在生产环境中运行.

您可以使用Laravel提供的app()->;Environment()函数判断当前环境.

if (app()->environment() !== 'production') {
    if (Schema::hasTable('settings')) {
        foreach (Setting::all() as $setting) {
            Config::set('settings.'.$setting->key, $setting->value);
        }
    }
}

这将确保代码仅在应用程序不在生产环境中时运行.这样,代码将不会干扰php artisan Package:DISCOVER的运行,并且不会在构建服务器上导致错误.

您还可以将设置值移动到配置文件中,并在应用程序在生产中运行时将其包括在内,这样当数据库不存在时,应用程序就不会崩溃.

另一种 Select 是,如果您只使用此服务类中的设置,则可以在构造函数方法中直接从数据库检索它们,而不是使用配置.这样,您就不必担心构建服务器上的设置是否可用,并且您仍然可以使用这些值,而不必担心它们会出现在配置中.

public function __construct()
{
    $this->domain = config('api.domain');
    $this->apiVersion = config('api.version');
    $setting = Setting::where('key', 'bearer_token')->first();
    $this->bearerToken = $setting->value;
    $this->clientId = config('api.client_id');
    $this->clientSecret = config('api.client_secret');
}

在此版本的构造函数中,它直接从数据库的设置表中检索BEARER_TOKE值,而不是使用配置.仍然从配置中检索api.domain、api.version、api.client_id和api.Client_secre值.

需要提醒的是,您应该确保处理的是数据库中没有该设置的情况,以避免应用程序中出现任何错误.

Laravel相关问答推荐

如何重置laravel ui密码

Laravel本地化错误:"setlocale():参数#1($category)的类型必须是int,给定的是Illuminate\Http\Request"

在 React 中将属性从一个组件传递到另一个组件

如何为 CMP 横幅安装谷歌同意脚本?

如何在 laravel 5.8 中显示自定义消息?

Laravel:在失败时处理 findOrFail()

laravel Eloquent 模型更新事件未触发

如何在 Laravel 中使用内存数据库的完整测试套件之前迁移和 seeder ?

Laravel:Blade foreach 循环 bootstrap 列

合并和排序两个 Eloquent 集合?

Laravel whereDoesntHave() - 多个 OR 条件

Eloquent ORM,deleted_at 使用软删除时没有索引

如何利用 StorageFacade 的 Filesystem 类的 glob 方法?

Laravel 全部返回 ID 变为 0

laravel 搜索多个以空格分隔的单词

日期验证 - 如何本地化/翻译字符串今天和明天

是否可以将路由参数传递给 Laravel 中的控制器构造函数?

在哪里放置 Blade::extend

Laravel - artisan不工作

在 Laravel 5 中找不到类App\Http\Controllers\admin\Auth