Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ErrorException Illegal offset type in PerformsValidation for custom fields with array attribute. #2834

Closed
mikebronner opened this issue Sep 3, 2020 · 3 comments

Comments

@mikebronner
Copy link

  • Laravel Version: 7.x
  • Nova Version: 3.8.4
  • PHP Version: 7.4.x
  • Database Driver & Version: n/a
  • Operating System and Version: Ubuntu 20.04
  • Browser type and version: Safari 14

Description:

The recent change made here (https://github.com/laravel/nova/commit/eebd0f5e80c22ac813c9e5bc9b462a0a097c23b4#diff-ef2858dddcf5b5ad37d0e8cede02604cR273) is breaking custom fields that return arrays as values.

Value of $item

  GeneaLabs\NovaMapMarkerField\MapMarker::__set_state(array(
     'component' => 'nova-map-marker-field',
     'name' => 'Location',
     'attribute' => 
    array (
      'latitude' => 'latitude',
      'longitude' => 'longitude',
      'default_zoom' => 12,
      'default_latitude' => 41.823611,
      'default_longitude' => -71.422222,
    ),
     'value' => NULL,
     'displayCallback' => NULL,
     'resolveCallback' => NULL,
     'fillCallback' => NULL,
     'computedCallback' => NULL,
     'defaultCallback' => NULL,
     'rules' => 
    array (
      0 => 'required',
      1 => 
      Closure::__set_state(array(
      )),
    ),
     'creationRules' => 
    array (
    ),
     'updateRules' => 
    array (
    ),
     'sortable' => false,
     'nullable' => false,
     'nullValues' => 
    array (
      0 => '',
    ),
     'pivot' => false,
     'textAlign' => 'left',
     'stacked' => false,
     'readonlyCallback' => NULL,
     'requiredCallback' => NULL,
     'resource' => NULL,
     'panel' => NULL,
     'showOnIndex' => false,
     'showOnDetail' => true,
     'showOnCreation' => true,
     'showOnUpdate' => true,
     'onlyOnDetail' => false,
     'meta' => 
    array (
      'defaultZoom' => 12,
      'defaultLatitude' => 41.823611,
      'defaultLongitude' => -71.422222,
    ),
     'seeCallback' => NULL,
     'helpText' => 'Identify the location where the building is, or once
                    stood. Enter the address in the map to get close, then
                    manually move the map around to get to the exact spot.',
     'helpWidth' => 250,
  ))

Stacktrace

ErrorException Illegal offset type 
    vendor/laravel/nova/src/PerformsValidation.php:273 Illuminate\Foundation\Bootstrap\HandleExceptions::handleError
    vendor/laravel/nova/src/PerformsValidation.php:273 Laravel\Nova\Resource::Laravel\Nova\{closure}
    vendor/laravel/framework/src/Illuminate/Support/Collection.php:685 Illuminate\Support\Collection::mapWithKeys
    vendor/laravel/nova/src/PerformsValidation.php:274 Laravel\Nova\Resource::attributeNamesForFields
    vendor/laravel/nova/src/PerformsValidation.php:20 Laravel\Nova\Resource::validateForCreation
    vendor/laravel/nova/src/Http/Controllers/ResourceStoreController.php:24 Laravel\Nova\Http\Controllers\ResourceStoreController::handle
    [internal] call_user_func_array
    vendor/laravel/framework/src/Illuminate/Routing/Controller.php:54 Illuminate\Routing\Controller::callAction
    vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php:45 Illuminate\Routing\ControllerDispatcher::dispatch
    vendor/laravel/framework/src/Illuminate/Routing/Route.php:239 Illuminate\Routing\Route::runController
    vendor/laravel/framework/src/Illuminate/Routing/Route.php:196 Illuminate\Routing\Route::run
    vendor/laravel/framework/src/Illuminate/Routing/Router.php:685 Illuminate\Routing\Router::Illuminate\Routing\{closure}
    vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:128 Illuminate\Pipeline\Pipeline::Illuminate\Pipeline\{closure}
    app/Http/Middleware/EnforceTenancy.php:15 App\Http\Middleware\EnforceTenancy::handle
    vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:167 Illuminate\Pipeline\Pipeline::Illuminate\Pipeline\{closure}
    vendor/laravel/nova/src/Http/Middleware/Authorize.php:18 Laravel\Nova\Http\Middleware\Authorize::handle
    vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:167 Illuminate\Pipeline\Pipeline::Illuminate\Pipeline\{closure}
    vendor/laravel/nova/src/Http/Middleware/BootTools.php:20 Laravel\Nova\Http\Middleware\BootTools::handle
    vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:167 Illuminate\Pipeline\Pipeline::Illuminate\Pipeline\{closure}
    vendor/laravel/nova/src/Http/Middleware/DispatchServingNovaEvent.php:20 Laravel\Nova\Http\Middleware\DispatchServingNovaEvent::handle
    vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:167 Illuminate\Pipeline\Pipeline::Illuminate\Pipeline\{closure}
    vendor/laravel/framework/src/Illuminate/Auth/Middleware/Authenticate.php:44 Illuminate\Auth\Middleware\Authenticate::handle
    vendor/laravel/nova/src/Http/Middleware/Authenticate.php:31 Laravel\Nova\Http\Middleware\Authenticate::handle
    vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:167 Illuminate\Pipeline\Pipeline::Illuminate\Pipeline\{closure}
    vendor/laravel/passport/src/Http/Middleware/CreateFreshApiToken.php:50 Laravel\Passport\Http\Middleware\CreateFreshApiToken::handle
    vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:167 Illuminate\Pipeline\Pipeline::Illuminate\Pipeline\{closure}
    vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php:41 Illuminate\Routing\Middleware\SubstituteBindings::handle
    vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:167 Illuminate\Pipeline\Pipeline::Illuminate\Pipeline\{closure}
    vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php:77 Illuminate\Foundation\Http\Middleware\VerifyCsrfToken::handle
    vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:167 Illuminate\Pipeline\Pipeline::Illuminate\Pipeline\{closure}
    vendor/laravel/framework/src/Illuminate/View/Middleware/ShareErrorsFromSession.php:49 Illuminate\View\Middleware\ShareErrorsFromSession::handle
    vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:167 Illuminate\Pipeline\Pipeline::Illuminate\Pipeline\{closure}
    vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php:116 Illuminate\Session\Middleware\StartSession::handleStatefulRequest
    vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php:62 Illuminate\Session\Middleware\StartSession::handle
    vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:167 Illuminate\Pipeline\Pipeline::Illuminate\Pipeline\{closure}
    vendor/laravel/framework/src/Illuminate/Cookie/Middleware/AddQueuedCookiesToResponse.php:37 Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::handle
    vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:167 Illuminate\Pipeline\Pipeline::Illuminate\Pipeline\{closure}
    vendor/laravel/framework/src/Illuminate/Cookie/Middleware/EncryptCookies.php:67 Illuminate\Cookie\Middleware\EncryptCookies::handle
    vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:167 Illuminate\Pipeline\Pipeline::Illuminate\Pipeline\{closure}
    vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:103 Illuminate\Pipeline\Pipeline::then
    vendor/laravel/framework/src/Illuminate/Routing/Router.php:687 Illuminate\Routing\Router::runRouteWithinStack
    vendor/laravel/framework/src/Illuminate/Routing/Router.php:662 Illuminate\Routing\Router::runRoute
    vendor/laravel/framework/src/Illuminate/Routing/Router.php:628 Illuminate\Routing\Router::dispatchToRoute
    vendor/laravel/framework/src/Illuminate/Routing/Router.php:617 Illuminate\Routing\Router::dispatch
    vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php:165 Illuminate\Foundation\Http\Kernel::Illuminate\Foundation\Http\{closure}
    vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:128 Illuminate\Pipeline\Pipeline::Illuminate\Pipeline\{closure}
    vendor/laravel/nova/src/Http/Middleware/ServeNova.php:26 Laravel\Nova\Http\Middleware\ServeNova::handle
    vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:167 Illuminate\Pipeline\Pipeline::Illuminate\Pipeline\{closure}
    vendor/barryvdh/laravel-debugbar/src/Middleware/InjectDebugbar.php:65 Barryvdh\Debugbar\Middleware\InjectDebugbar::handle
    vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:167 Illuminate\Pipeline\Pipeline::Illuminate\Pipeline\{closure}
    vendor/genealabs/laravel-casts/src/Http/Middleware/AssetInjection.php:11 GeneaLabs\LaravelCasts\Http\Middleware\AssetInjection::handle
    vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:167 Illuminate\Pipeline\Pipeline::Illuminate\Pipeline\{closure}
    vendor/fideloper/proxy/src/TrustProxies.php:57 Fideloper\Proxy\TrustProxies::handle
    vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:167 Illuminate\Pipeline\Pipeline::Illuminate\Pipeline\{closure}
    vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php:21 Illuminate\Foundation\Http\Middleware\TransformsRequest::handle
    vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:167 Illuminate\Pipeline\Pipeline::Illuminate\Pipeline\{closure}
    vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php:21 Illuminate\Foundation\Http\Middleware\TransformsRequest::handle
    vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:167 Illuminate\Pipeline\Pipeline::Illuminate\Pipeline\{closure}
    vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php:27 Illuminate\Foundation\Http\Middleware\ValidatePostSize::handle
    vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:167 Illuminate\Pipeline\Pipeline::Illuminate\Pipeline\{closure}
    vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/CheckForMaintenanceMode.php:63 Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::handle
    vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:167 Illuminate\Pipeline\Pipeline::Illuminate\Pipeline\{closure}
    vendor/hyn/multi-tenant/src/Middleware/EagerIdentification.php:29 Hyn\Tenancy\Middleware\EagerIdentification::handle
    vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:167 Illuminate\Pipeline\Pipeline::Illuminate\Pipeline\{closure}
    vendor/hyn/multi-tenant/src/Middleware/HostnameActions.php:75 Hyn\Tenancy\Middleware\HostnameActions::handle
    vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:167 Illuminate\Pipeline\Pipeline::Illuminate\Pipeline\{closure}
    vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:103 Illuminate\Pipeline\Pipeline::then
    vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php:140 Illuminate\Foundation\Http\Kernel::sendRequestThroughRouter
    vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php:109 Illuminate\Foundation\Http\Kernel::handle
    public/index.php:55 [main]

Any suggestions on how to deal with this? Thanks!

@stale
Copy link

stale bot commented Nov 2, 2020

This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.

@stale stale bot added the stale label Nov 2, 2020
@crynobone
Copy link
Member

Hi @mikebronner, you still think we should fix this or your workaround should already be enough. We could make some changes to check whether $field->attribute is a string but a bit worried it would cause problem on other use case that we are not aware of:

    /**
     * Map field attributes to field names.
     *
     * @param \Laravel\Nova\Http\Requests\NovaRequest $request
     * @return Illuminate\Support\Collection
     */
    private static function attributeNamesForFields(NovaRequest $request)
    {
        return (new static(static::newModel()))
            ->availableFields($request)
            ->reject(function ($item) {
                return empty($item->name);
            })
            ->filter(function ($item) {
                return is_string($item->attribute);
            })
            ->mapWithKeys(function ($item) {
                return [$item->attribute => $item->name];
            });
    }

@stale stale bot removed the stale label Nov 3, 2020
@Donkfather
Copy link

Well ? do we have a fix for this ?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants