colymba / silverstripe-restfulapi

SilverStripe RESTful API with a default JSON serializer.
BSD 3-Clause "New" or "Revised" License
64 stars 33 forks source link

Config::type_mismatch when authentication_policy is an array #77

Closed dylanitorium closed 7 years ago

dylanitorium commented 7 years ago

When setting authentication_policy to an array of methods a Config::type_mismatch() error is thrown due to the initial value being false.

colymba commented 7 years ago

@dylanitorium are you setting your config via YML or PHP? Can you also confirm the framework version you are using?

Would be great if you could post your config and the PHP error dump.

dylanitorium commented 7 years ago

Hey yeah, sorry I should have done that in the first place. I'm setting the config via YML and using the version is 3.5.

Error dump:

[User Error] Uncaught UnexpectedValueException: Type mismatch in configuration. All values for a particular property must contain the same type (or no value at all).
GET /api/regionalOffice
Line 169 in /home/ubuntu/projects/moeforms/framework/core/Config.php
Source
160         return self::ISNT_ARRAY;
161     }
162 
163     /**
164      * What to do if there's a type mismatch.
165      *
166      * @throws UnexpectedValueException
167      */
168     protected static function type_mismatch() {
169         throw new UnexpectedValueException('Type mismatch in configuration. All values for a particular property must'
170             . ' contain the same type (or no value at all).');
171     }
172 
173     /**
174      * @todo If we can, replace next static & static methods with DI once that's in
175      */
Trace
Config::type_mismatch() 
Config.php:433
Config::merge_low_into_high(Array,,) 
Config.php:540
Config->getUncached(RESTfulAPI,authentication_policy,0,Array,,Array) 
Config.php:592
Config->get(RESTfulAPI,authentication_policy) 
Config.php:917
Config_ForClass->__get(authentication_policy) 
RESTfulAPI.php:343
RESTfulAPI->index(SS_HTTPRequest) 
RequestHandler.php:288
RequestHandler->handleAction(SS_HTTPRequest,index) 
Controller.php:202
Controller->handleAction(SS_HTTPRequest,index) 
RequestHandler.php:200
RequestHandler->handleRequest(SS_HTTPRequest,DataModel) 
Controller.php:158
Controller->handleRequest(SS_HTTPRequest,DataModel) 
Director.php:385
Director::handleRequest(SS_HTTPRequest,Session,DataModel) 
Director.php:149
Director::direct(/api/regionalOffice,DataModel) 
main.php:191

config.yml:

# Extensions
Subsite:
  extensions:
    - 'FormDataSubsiteExtension'

# API Access
BaseSubmission:
  api_access: 'POST,PUT,GET,DELETE'

School:
  api_access: 'GET'

RegionalOffice:
  api_access: 'GET'

Gender:
  api_access: 'GET'

Dichotomy:
  api_access: 'GET'

# Components config
RESTfulAPI_DefaultQueryHandler:
  dependencies:
    deSerializer: '%$RESTfulAPI_MoeForms_EmberDataDeSerializer'

# RestfulAPI config
RESTfulAPI:
  dependencies:
    serializer: '%$RESTfulAPI_MoeForms_EmberDataSerializer'

  cors:
    Enabled: true
    Allow-Origin: '*'
    Allow-Headers: '*'
    Allow-Methods: 'OPTIONS, GET, PUT, POST, PATCH, DELETE'
    Max-Age: 86400

  authentication_policy:
    - 'DELETE'
    - 'PUT'

Let me know if I can provide anything else. If it helps, when I set the RESTfulAPI::authentication_policy to the array in PHP it seems to work okay.

Cheers!

colymba commented 7 years ago

@dylanitorium this came from the default false config value. Just push a new commit and release that fixes it.