I am writing a fairly simple application that requires the Backbone.js and Laravel 4 models to sync. Problems arise when Laravel models include Carbon dates. My Laravel controller looks like this:
class OrderController extends \BaseController { ... public function update($id = null) { ... if (Request::ajax()) return $order; ... } }
This successfully responds to the JSON representation of $ order, which the client side uses for synchronization. However, Carbon dates are returned as a representation of the Carbon object, for example:
{ "delivered_at":{"date":"2014-02-25 12:55:29","timezone_type":3,"timezone":"America\/Argentina\/Buenos_Aires"} }
I could easily interpret this as a javascript date object, however, when this object returns to laravel, JSON removes the Carbon class, and Eloquent cannot read it as a date:
[2014-02-25 12:58:32] log.ERROR: exception 'ErrorException' with message 'preg_match() expects parameter 2 to be string, array given' in vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php:2210 Stack trace: #0 [internal function]: Illuminate\Exception\Handler->handleError(2, 'preg_match() ex...', '/Users/maurospi...', 2210, Array) #1 vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php(2210): preg_match('/^(\d{4})-(\d{2...', Array) #2 vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php(2151): Illuminate\Database\Eloquent\Model->fromDateTime(Array) #3 vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php(306): Illuminate\Database\Eloquent\Model->setAttribute('delivered_at', Array) #4 app/controllers/OrderController.php(120): Illuminate\Database\Eloquent\Model->fill(Array) #5 [internal function]: OrderController->update('91') #6 vendor/laravel/framework/src/Illuminate/Routing/Controllers/Controller.php(138): call_user_func_array(Array, Array) #7 vendor/laravel/framework/src/Illuminate/Routing/Controllers/Controller.php(115): Illuminate\Routing\Controllers\Controller->callMethod('update', Array) #8 vendor/laravel/framework/src/Illuminate/Routing/Router.php(985): Illuminate\Routing\Controllers\Controller->callAction(Object(Illuminate\Foundation\Application), Object(Illuminate\Routing\Router), 'update', Array) #9 [internal function]: Illuminate\Routing\{closure}('91') #10 vendor/laravel/framework/src/Illuminate/Routing/Route.php(80): call_user_func_array(Object(Closure), Array) #11 vendor/laravel/framework/src/Illuminate/Routing/Route.php(47): Illuminate\Routing\Route->callCallable() #12 vendor/laravel/framework/src/Illuminate/Routing/Router.php(1016): Illuminate\Routing\Route->run(Object(Illuminate\Http\Request)) #13 vendor/laravel/framework/src/Illuminate/Foundation/Application.php(574): Illuminate\Routing\Router->dispatch(Object(Illuminate\Http\Request)) #14 vendor/laravel/framework/src/Illuminate/Foundation/Application.php(550): Illuminate\Foundation\Application->dispatch(Object(Illuminate\Http\Request)) #15 public/index.php(49): Illuminate\Foundation\Application->run() #16 {main} [] []
Therefore I need:
- Extend the JsonResponse class to convert carbon dates to string representations.
- Extend the Eloquent class to interpret the
Carbon class StdClass objects to dates. - Do something that I am clearly missing, Laravel 4 claims to be cool in REST, so I think I missed something.
Mauro
source share