tenancy / multi-tenant

Run multiple websites using the same Laravel installation while keeping tenant specific data separated for fully independent multi-domain setups, previously github.com/hyn/multi-tenant
https://tenancy.dev
MIT License
2.56k stars 393 forks source link

Database [tenant] not configured. #688

Closed marccastejon closed 5 years ago

marccastejon commented 5 years ago

I've followed the tutorial here to build a multi tenant app: https://laravel-tenancy.com/docs/hyn/5.1/full-featured-tutorial

Which works great, however I would like to have a unique landing page for all the tenants to log in from. I get the following error when I try to log in from the main app: Database [tenant] not configured.

In other words, at the moment,

Current behavior:

Expected behavior: What I would like to do is:

Env:


tenancy.php config


<?php

/*
 * This file is part of the hyn/multi-tenant package.
 *
 * (c) Daniël Klabbers <daniel@klabbers.email>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 *
 * @see https://laravel-tenancy.com
 * @see https://github.com/hyn/multi-tenant
 */

use Hyn\Tenancy\Database\Connection;

return [
    'models' => [
        /**
         * Specify different models to be used for the global, system database
         * connection. These are also used in their relationships. Models
         * used have to implement their respective contracts and
         * either extend the SystemModel or use the trait
         * UsesSystemConnection.
         */

        // Must implement \Hyn\Tenancy\Contracts\Customer
        'customer' => \Hyn\Tenancy\Models\Customer::class,

        // Must implement \Hyn\Tenancy\Contracts\Hostname
        'hostname' => \Hyn\Tenancy\Models\Hostname::class,

        // Must implement \Hyn\Tenancy\Contracts\Website
        'website' => \Hyn\Tenancy\Models\Website::class
    ],
    'website' => [
        /**
         * Each website has a short random hash that identifies this entity
         * to the application. By default this id is randomized and fully
         * auto-generated. In case you want to force your own logic for
         * when you need to have a better overview of the complete
         * tenant folder structure, disable this and implement
         * your own id generation logic.
         */
        'disable-random-id' => false,

        /**
         * The random Id generator is responsible for creating the hash as mentioned
         * above. You can override what generator to use by modifying this value
         * in the configuration.
         *
         * @warn This won't work if disable-random-id is true.
         */
        'random-id-generator' => Hyn\Tenancy\Generators\Uuid\ShaGenerator::class,

        /**
         * Enable this flag in case you're using a driver that does not support
         * database username or database name with a length of more than 32 characters.
         *
         * This should be enabled for MySQL, but not for MariaDB and PostgreSQL.
         */
        'uuid-limit-length-to-32' => env('LIMIT_UUID_LENGTH_32', false),

        /**
         * Specify the disk you configured in the filesystems.php file where to store
         * the tenant specific files, including media, packages, routes and other
         * files for this particular website.
         *
         * @info If not set, will revert to the default filesystem.
         */
        'disk' => null,

        /**
         * Automatically generate a tenant directory based on the random id of the
         * website. Uses the above disk to store files to override system-wide
         * files.
         *
         * @info set to false to disable.
         */
        'auto-create-tenant-directory' => true,

        /**
         * Automatically rename the tenant directory when the random id of the
         * website changes. This should not be too common, but in case it happens
         * we automatically want to move files accordingly.
         *
         * @info set to false to disable.
         */
        'auto-rename-tenant-directory' => true,

        /**
         * Automatically deletes the tenant specific directory and all files
         * contained within.
         *
         * @see
         * @info set to true to enable.
         */
//        'auto-delete-tenant-directory' => false,
        'auto-delete-tenant-directory' => env('AUTO_DELETE_TENANT_DIRECTORY', false),

        /**
         * Time to cache websites in minutes. Set to false to disable.
         */
        'cache' => 10,
    ],
    'hostname' => [
        /**
         * If you want the multi tenant application to fall back to a default
         * hostname/website in case the requested hostname was not found
         * in the database, complete in detail the default hostname.
         *
         * @warn this must be a FQDN, these have no protocol or path!
         */
        'default' => env('TENANCY_DEFAULT_HOSTNAME'),
        /**
         * The package is able to identify the requested hostname by itself,
         * disable to get full control (and responsibility) over hostname
         * identification. The hostname identification is needed to
         * set a specific website as currently active.
         *
         * @see src/Jobs/HostnameIdentification.php
         */
        'auto-identification' => env('TENANCY_AUTO_HOSTNAME_IDENTIFICATION', true),

        /**
         * In case you want to have the tenancy environment set up early,
         * enable this flag. This will run the tenant identification
         * inside a middleware. This will eager load tenancy.
         *
         * A good use case is when you have set "tenant" as the default
         * database connection.
         */
        'early-identification' => env('TENANCY_EARLY_IDENTIFICATION', true),

        /**
         * Abort application execution in case no hostname was identified. This will throw a
         * 404 not found in case the tenant hostname was not resolved.
         */
        'abort-without-identified-hostname' => false,

        /**
         * Time to cache hostnames in minutes. Set to false to disable.
         */
        'cache' => 10,

        /**
         * Automatically update the app.url configured inside Laravel to match
         * the tenant FQDN whenever a hostname/tenant was identified.
         *
         * This will resolve issues with password reset mails etc using the
         * correct domain.
         */
        'update-app-url' => true,
    ],
    'db' => [
        /**
         * The default connection to use; this overrules the Laravel database.default
         * configuration setting. In Laravel this is normally configured to 'mysql'.
         * You can set a environment variable to override the default database
         * connection to - for instance - the tenant connection 'tenant'.
         */
        'default' => env('TENANCY_DEFAULT_CONNECTION'),
        /**
         * Used to give names to the system and tenant database connections. By
         * default we configure 'system' and 'tenant'. The tenant connection
         * is set up automatically by this package.
         *
         * @see src/Database/Connection.php
         * @var system-connection-name The database connection name to use for the global/system database.
         * @var tenant-connection-name The database connection name to use for the tenant database.
         */
        'system-connection-name' => env('TENANCY_SYSTEM_CONNECTION_NAME', Connection::DEFAULT_SYSTEM_NAME),
        'tenant-connection-name' => env('TENANCY_TENANT_CONNECTION_NAME', Connection::DEFAULT_TENANT_NAME),

        /**
         * The tenant division mode specifies to what database websites will be
         * connecting. The default setup is to use a new database per tenant.
         * In case you prefer to use the same database with a table prefix,
         * set the mode to 'prefix'.
         *
         * @see src/Database/Connection.php
         */
        'tenant-division-mode' => env('TENANCY_DATABASE_DIVISION_MODE', 'database'),

        /**
         * The database password generator takes care of creating a valid hashed
         * string used for tenants to connect to the specific database. Do
         * note that this will only work in 'division modes' that set up
         * a connection to a separate database.
         */
        'password-generator' => Hyn\Tenancy\Generators\Database\DefaultPasswordGenerator::class,

        /**
         * The tenant migrations to be run during creation of a tenant. Specify a directory
         * to run the migrations from. If specified these migrations will be executed
         * whenever a new tenant is created.
         *
         * @info set to false to disable auto migrating.
         *
         * @warn this has to be an absolute path, feel free to use helper methods like
         * base_path() or database_path() to set this up.
         */
        'tenant-migrations-path' => database_path('migrations/tenant'),

        /**
         * The default Seeder class used on newly created databases and while
         * running artisan commands that fire seeding.
         *
         * @info requires tenant-migrations-path in order to seed newly created websites.
         *
         * @warn specify a valid fully qualified class name.
         * @example App\Seeders\AdminSeeder::class
         */
        'tenant-seed-class' => TenantDatabaseSeeder::class,

        /**
         * Automatically generate a tenant database based on the random id of the
         * website.
         *
         * @info set to false to disable.
         */
        'auto-create-tenant-database' => true,

        /**
         * Automatically generate the user needed to access the database.
         *
         * @info Useful in case you use root or another predefined user to access the
         *       tenant database.
         * @info Only creates in case tenant databases are set to be created.
         *
         * @info set to false to disable.
         */
        'auto-create-tenant-database-user' => true,

        /**
         * Automatically rename the tenant database when the random id of the
         * website changes. This should not be too common, but in case it happens
         * we automatically want to move databases accordingly.
         *
         * @info set to false to disable.
         */
        'auto-rename-tenant-database' => true,

        /**
         * Automatically deletes the tenant specific database and all data
         * contained within.
         *
         * @info set to true to enable.
         */
//        'auto-delete-tenant-database' => env('TENANCY_DATABASE_AUTO_DELETE', false),
        'auto-delete-tenant-database' => env('AUTO_DELETE_TENANT_DATABASE', false),

        /**
         * Automatically delete the user needed to access the tenant database.
         *
         * @info Set to false to disable.
         * @info Only deletes in case tenant database is set to be deleted.
         */
        'auto-delete-tenant-database-user' => env('TENANCY_DATABASE_AUTO_DELETE_USER', false),

        /**
         * Define a list of classes that you wish to force onto the tenant or system connection.
         * The connection will be forced when the Model has booted.
         *
         * @info Useful for overriding the connection of third party packages.
         */
        'force-tenant-connection-of-models' => [
//            \App\User::class
        ],
        'force-system-connection-of-models' => [
//            \App\User::class
        ],
    ],
    'folders' => [
        'config' => [
            /**
             * Merge configuration files from the config directory
             * inside the tenant directory with the global configuration files.
             */
            'enabled' => true,

            /**
             * List of configuration files to ignore, preventing override of crucial
             * application configurations.
             */
            'blacklist' => ['database', 'tenancy', 'webserver'],
        ],
        'routes' => [
            /**
             * Allows adding and overriding URL routes inside the tenant directory.
             */
            'enabled' => true,

            /**
             * Prefix all tenant routes.
             */
            'prefix' => null,
       ],
        'trans' => [
            /**
             * Allows reading translation files from a trans directory inside
             * the tenant directory.
             */
            'enabled' => true,

            /**
             * Will override the global translations with the tenant translations.
             * This is done by overriding the laravel default translator with the new path.
             */
            'override-global' => true,

            /**
             * In case you disabled global override, specify a namespace here to load the
             * tenant translation files with.
             */
            'namespace' => 'tenant',
        ],
        'vendor' => [
            /**
             * Allows using a custom vendor (composer driven) folder inside
             * the tenant directory.
             */
            'enabled' => true,
        ],
        'media' => [
            /**
             * Mounts the assets directory with (static) files for public use.
             */
            'enabled' => true,
        ],
        'views' => [
            /**
             * Adds the vendor directory of the tenant inside the application.
             */
            'enabled' => true,

            /**
             * Specify a namespace to use with which to load the views.
             *
             * @eg setting `tenant` will allow you to use `tenant::some.blade.php`
             * @info set to null to add to the global namespace.
             */
            'namespace' => null,

            /**
             * If `namespace` is set to null (thus using the global namespace)
             * make it override the global views. Disable to
             */
            'override-global' => true,
        ]
    ]
];

_routes/web.php:

Route::get('/', function () {
     return view('landing');
});

# dashboard
Route::get('/home', 'HomeController@index')->name('home');

Route::group(['middleware' => 'tenancy.enforce'], function () {
        Auth::routes();
});

Logs:


InvalidArgumentException thrown with message "Database [tenant] not configured."

Stacktrace:
#76 InvalidArgumentException in /home/dev/propane/vendor/laravel/framework/src/Illuminate/Database/DatabaseManager.php:140
#75 Illuminate\Database\DatabaseManager:configuration in /home/dev/propane/vendor/laravel/framework/src/Illuminate/Database/DatabaseManager.php:103
#74 Illuminate\Database\DatabaseManager:makeConnection in /home/dev/propane/vendor/laravel/framework/src/Illuminate/Database/DatabaseManager.php:74
#73 Illuminate\Database\DatabaseManager:connection in /home/dev/propane/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php:1201
#72 Illuminate\Database\Eloquent\Model:resolveConnection in /home/dev/propane/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php:1167
#71 Illuminate\Database\Eloquent\Model:getConnection in /home/dev/propane/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php:997
#70 Illuminate\Database\Eloquent\Model:newBaseQueryBuilder in /home/dev/propane/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php:912
#69 Illuminate\Database\Eloquent\Model:newModelQuery in /home/dev/propane/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php:950
#68 Illuminate\Database\Eloquent\Model:newQueryWithoutScopes in /home/dev/propane/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php:901
#67 Illuminate\Database\Eloquent\Model:newQuery in /home/dev/propane/vendor/laravel/framework/src/Illuminate/Auth/EloquentUserProvider.php:114
#66 Illuminate\Auth\EloquentUserProvider:retrieveByCredentials in /home/dev/propane/vendor/laravel/framework/src/Illuminate/Auth/SessionGuard.php:350
#65 Illuminate\Auth\SessionGuard:attempt in /home/dev/propane/vendor/laravel/framework/src/Illuminate/Foundation/Auth/AuthenticatesUsers.php:79
#64 App\Http\Controllers\Auth\LoginController:attemptLogin in /home/dev/propane/vendor/laravel/framework/src/Illuminate/Foundation/Auth/AuthenticatesUsers.php:44
#63 App\Http\Controllers\Auth\LoginController:login in /home/dev/propane/vendor/laravel/framework/src/Illuminate/Routing/Controller.php:54
#62 call_user_func_array in /home/dev/propane/vendor/laravel/framework/src/Illuminate/Routing/Controller.php:54
#61 Illuminate\Routing\Controller:callAction in /home/dev/propane/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php:45
#60 Illuminate\Routing\ControllerDispatcher:dispatch in /home/dev/propane/vendor/laravel/framework/src/Illuminate/Routing/Route.php:212
#59 Illuminate\Routing\Route:runController in /home/dev/propane/vendor/laravel/framework/src/Illuminate/Routing/Route.php:169
#58 Illuminate\Routing\Route:run in /home/dev/propane/vendor/laravel/framework/src/Illuminate/Routing/Router.php:665
#57 Illuminate\Routing\Router:Illuminate\Routing\{closure} in /home/dev/propane/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php:30
#56 Illuminate\Routing\Pipeline:Illuminate\Routing\{closure} in /home/dev/propane/app/Http/Middleware/RedirectIfAuthenticated.php:24
#55 App\Http\Middleware\RedirectIfAuthenticated:handle in /home/dev/propane/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:151
#54 Illuminate\Pipeline\Pipeline:Illuminate\Pipeline\{closure} in /home/dev/propane/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php:53
#53 Illuminate\Routing\Pipeline:Illuminate\Routing\{closure} in /home/dev/propane/app/Http/Middleware/EnforceTenancy.php:10
#52 App\Http\Middleware\EnforceTenancy:handle in /home/dev/propane/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:151
#51 Illuminate\Pipeline\Pipeline:Illuminate\Pipeline\{closure} in /home/dev/propane/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php:53
#50 Illuminate\Routing\Pipeline:Illuminate\Routing\{closure} in /home/dev/propane/vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php:41
#49 Illuminate\Routing\Middleware\SubstituteBindings:handle in /home/dev/propane/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:151
#48 Illuminate\Pipeline\Pipeline:Illuminate\Pipeline\{closure} in /home/dev/propane/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php:53
#47 Illuminate\Routing\Pipeline:Illuminate\Routing\{closure} in /home/dev/propane/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php:68
#46 Illuminate\Foundation\Http\Middleware\VerifyCsrfToken:handle in /home/dev/propane/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:151
#45 Illuminate\Pipeline\Pipeline:Illuminate\Pipeline\{closure} in /home/dev/propane/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php:53
#44 Illuminate\Routing\Pipeline:Illuminate\Routing\{closure} in /home/dev/propane/vendor/laravel/framework/src/Illuminate/View/Middleware/ShareErrorsFromSession.php:49
#43 Illuminate\View\Middleware\ShareErrorsFromSession:handle in /home/dev/propane/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:151
#42 Illuminate\Pipeline\Pipeline:Illuminate\Pipeline\{closure} in /home/dev/propane/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php:53
#41 Illuminate\Routing\Pipeline:Illuminate\Routing\{closure} in /home/dev/propane/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php:63
#40 Illuminate\Session\Middleware\StartSession:handle in /home/dev/propane/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:151
#39 Illuminate\Pipeline\Pipeline:Illuminate\Pipeline\{closure} in /home/dev/propane/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php:53
#38 Illuminate\Routing\Pipeline:Illuminate\Routing\{closure} in /home/dev/propane/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/AddQueuedCookiesToResponse.php:37
#37 Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse:handle in /home/dev/propane/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:151
#36 Illuminate\Pipeline\Pipeline:Illuminate\Pipeline\{closure} in /home/dev/propane/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php:53
#35 Illuminate\Routing\Pipeline:Illuminate\Routing\{closure} in /home/dev/propane/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/EncryptCookies.php:66
#34 Illuminate\Cookie\Middleware\EncryptCookies:handle in /home/dev/propane/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:151
#33 Illuminate\Pipeline\Pipeline:Illuminate\Pipeline\{closure} in /home/dev/propane/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php:53
#32 Illuminate\Routing\Pipeline:Illuminate\Routing\{closure} in /home/dev/propane/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:104
#31 Illuminate\Pipeline\Pipeline:then in /home/dev/propane/vendor/laravel/framework/src/Illuminate/Routing/Router.php:667
#30 Illuminate\Routing\Router:runRouteWithinStack in /home/dev/propane/vendor/laravel/framework/src/Illuminate/Routing/Router.php:642
#29 Illuminate\Routing\Router:runRoute in /home/dev/propane/vendor/laravel/framework/src/Illuminate/Routing/Router.php:608
#28 Illuminate\Routing\Router:dispatchToRoute in /home/dev/propane/vendor/laravel/framework/src/Illuminate/Routing/Router.php:597
#27 Illuminate\Routing\Router:dispatch in /home/dev/propane/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php:176
#26 Illuminate\Foundation\Http\Kernel:Illuminate\Foundation\Http\{closure} in /home/dev/propane/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php:30
#25 Illuminate\Routing\Pipeline:Illuminate\Routing\{closure} in /home/dev/propane/vendor/fideloper/proxy/src/TrustProxies.php:57
#24 Fideloper\Proxy\TrustProxies:handle in /home/dev/propane/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:151
#23 Illuminate\Pipeline\Pipeline:Illuminate\Pipeline\{closure} in /home/dev/propane/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php:53
#22 Illuminate\Routing\Pipeline:Illuminate\Routing\{closure} in /home/dev/propane/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php:31
#21 Illuminate\Foundation\Http\Middleware\TransformsRequest:handle in /home/dev/propane/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:151
#20 Illuminate\Pipeline\Pipeline:Illuminate\Pipeline\{closure} in /home/dev/propane/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php:53
#19 Illuminate\Routing\Pipeline:Illuminate\Routing\{closure} in /home/dev/propane/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php:31
#18 Illuminate\Foundation\Http\Middleware\TransformsRequest:handle in /home/dev/propane/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:151
#17 Illuminate\Pipeline\Pipeline:Illuminate\Pipeline\{closure} in /home/dev/propane/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php:53
#16 Illuminate\Routing\Pipeline:Illuminate\Routing\{closure} in /home/dev/propane/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php:27
#15 Illuminate\Foundation\Http\Middleware\ValidatePostSize:handle in /home/dev/propane/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:151
#14 Illuminate\Pipeline\Pipeline:Illuminate\Pipeline\{closure} in /home/dev/propane/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php:53
#13 Illuminate\Routing\Pipeline:Illuminate\Routing\{closure} in /home/dev/propane/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/CheckForMaintenanceMode.php:62
#12 Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode:handle in /home/dev/propane/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:151
#11 Illuminate\Pipeline\Pipeline:Illuminate\Pipeline\{closure} in /home/dev/propane/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php:53
#10 Illuminate\Routing\Pipeline:Illuminate\Routing\{closure} in /home/dev/propane/vendor/hyn/multi-tenant/src/Middleware/EagerIdentification.php:29
#9 Hyn\Tenancy\Middleware\EagerIdentification:handle in /home/dev/propane/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:151
#8 Illuminate\Pipeline\Pipeline:Illuminate\Pipeline\{closure} in /home/dev/propane/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php:53
#7 Illuminate\Routing\Pipeline:Illuminate\Routing\{closure} in /home/dev/propane/vendor/hyn/multi-tenant/src/Middleware/HostnameActions.php:76
#6 Hyn\Tenancy\Middleware\HostnameActions:handle in /home/dev/propane/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:151
#5 Illuminate\Pipeline\Pipeline:Illuminate\Pipeline\{closure} in /home/dev/propane/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php:53
#4 Illuminate\Routing\Pipeline:Illuminate\Routing\{closure} in /home/dev/propane/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:104
#3 Illuminate\Pipeline\Pipeline:then in /home/dev/propane/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php:151
#2 Illuminate\Foundation\Http\Kernel:sendRequestThroughRouter in /home/dev/propane/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php:116
#1 Illuminate\Foundation\Http\Kernel:handle in /home/dev/propane/public/index.php:55
#0 require in /home/dev/.config/composer/vendor/cpriego/valet-linux/server.php:204
luceos commented 5 years ago

Upgrade to the latest version of hyn and use the fallback option as per documentation.