문제

쓰고 있어요 매우 간단한 응용 프로그램을 requiers Backbone.js 모델 Laravel4 델록 동기화됩니다.문제가 발생한 경우 나 Laravel 모델을 포함 습니다.내 Laravel 컨트롤러는 다음과 같습니다:

class OrderController extends \BaseController {
    ...
    public function update($id = null) {
        ...
        if (Request::ajax()) 
            return $order;
        ...
    }
}

이 성공적으로 응답이 JSON 으로 표현$순서는 클라이언트 측의 사용을 동기화 상태를 유지합니다.그러나,탄소 날짜 반환되는 탄소의 개체의 표현,다음과 같다:

{
    "delivered_at":{"date":"2014-02-25 12:55:29","timezone_type":3,"timezone":"America\/Argentina\/Buenos_Aires"}
}

로 관리할 수 있을 해석하는 이것으로 자바스크립트 Date 객체를 매우 쉽게,그러나,이 때 물체가 다시 laravel,JSON 제거 Carbon 클래스고 설득력이 실패하는 것을 읽으로 날짜:

[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} [] []

그래서 나는 하나가 필요하다:

  1. 을 확장하 JsonResponse 등 변환 탄소날짜를 문자열 표현입니다.
  2. 확장 웅변 등을 해석하는 StdClass 체의 Carbon 클래스 구조합니다.
  3. 뭔가를 내가 명확하게 누락,Laravel4 주장하는 멋진 나머지에 그래서 난 뭔가를 누락.
도움이 되었습니까?

해결책

첫째, Controller에서 API를 분리하는 것이 좋습니다.API 호출에 대한 리소스를 사용하십시오.

LARAVEL에 반환 된 객체의 경우 오류를 얻으려면 어떻게 처리하는지 모르겠지만 카본 날짜를 원한다면 새로운 탄소 인스턴스를 시작해야합니다.그렇지 않으면 날짜를 문자열로 반환 할 수 있습니다. LARAVLE의 모델은 나머지를 처리합니다.

객체가 반환 된 것으로 가정합니다 :

{
    "delivered_at":{"date":"2014-02-25 12:55:29","timezone_type":3,"timezone":"America\/Argentina\/Buenos_Aires"}
}
.

및 변수 $ 데이터가 현재 응답을 가질 수 있습니다. 단순히 velored_at :

를 덮어 쓸 수 있습니다.
$data->delivered_at = $data->delivered_at->date;
.

또는 카본 객체를 원한다면 :

$data->delivered_at = new \Carbon\Carbon($data->delivered_at->date, $data->delivered_at->timezone);
.

다른 팁

이것은 조금 늦게 올 것입니다. 그러나 나는 이것을 달성하기 위해 일반적으로 접근 자와 돌출기를 사용합니다.예를 들어, 모든 created_atupdated_at 필드를 Atom 형식으로 항상 반환하려면 다른 모든 모델이 상속하는 Eloquent를 확장하는 기본 모델 클래스를 만듭니다.

use Carbon\Carbon as Carbon;
use Illuminate\Database\Eloquent\Model as Model;

class BaseModel extends Model {

    public function getCreatedAtAttribute($value)
    {
        return Carbon::parse($value)->toATOMString();
    }

    public function setCreatedAtAttribute($value)
    {
        $this->attributes['created_at'] = Carbon::parse($value)->toDateTimeString();
    }

    public function getUpdatedAtAttribute($value)
    {
        return Carbon::parse($value)->toATOMString();
    }

    public function setUpdatedAtAttribute($value)
    {
        $this->attributes['created_at'] = Carbon::parse($value)->toDateTimeString();
    }
}
.

이것은 동일하지 않을 수 있지만 타임 스탬프와 탄소로 작업 할 때이 오류를 얻을 수 있습니다. 그러나 STRTOTIME ()을 사용하여 제가 통과 한 데이터를 사용하여 문제가 해결되었을 수 있습니다.

백본과 래블에서 날짜를 처리하는 방법은 영향을 미칩니다.
날짜 형식을 하나 선택하고 스틱해야합니다.그리고 양측이 데이터를 전달할 때 해당 형식으로 변환하고 JS와 컨트롤러로 전달할 때

순수한 JavAscript 날짜 개체를 보내면 다음과 같이 보이는 날짜 문자열을 반환합니다. "Sat Apr 19 2014 00:00:00 GMT+0200 (South Africa Standard Time)"
PHP의 strtotime가 펑키를 구문 분석하기 때문에 그렇게 좋지 않습니다.

다음은 예제입니다.

$jsdate = "Sat Apr 19 2014 00:00:00 GMT+0200 (South Africa Standard Time)";
$carbon = Carbon::createFromTimestamp(strtotime($jsdate));
$iso8601 = $carbon ->format(Carbon::ISO8601)
//output '1970-01-01T02:00:00+0200' which is a UNIX timestamp 0.
.

그 날짜는 무엇입니까? 어쩌면 다른 누군가가 더 잘 자세히 설명 할 수 있습니다. 사용자 정의 날짜 형식을 사용하여 올바르게 읽을 수 있지만 두 가지 형식을 사용하여 이해할 수 있습니다.

ISO8601

와 같습니다
//javascript
var jsdate = (new Date()).toISOString();
.

및 PHP 탄소에서는 문제없이 처리 할 수 있어야합니다

을 얻으려면 날짜를 열의 모델(created_at 에서)문자열 형식을 사용하여 다음과 같다:

$response['created_at'] = Carbon::parse($model->created_at)->toDateString();

이 변경됩니다

created_at = {"date":"2014-02-25 12:55:29","timezone_type":3,"timezone":"America\/Argentina\/Buenos_Aires"}

이:

created_at = "2014-02-25 12:55:29"

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top