Skip to content

Instantly share code, notes, and snippets.

@ahmadrio
Created October 10, 2019 05:56
Show Gist options
  • Save ahmadrio/2facfe0a018e3c2451394e3aa46c3b62 to your computer and use it in GitHub Desktop.
Save ahmadrio/2facfe0a018e3c2451394e3aa46c3b62 to your computer and use it in GitHub Desktop.
<?php
namespace App\Http\Controllers\Post;
use Illuminate\Routing\Controller;
use Illuminate\Support\Facades\DB;
use Laravel\Nova\Actions\ActionEvent;
use Laravel\Nova\Http\Requests\UpdateResourceRequest;
class UpdateController extends Controller
{
/**
* Create a new resource.
*
* @param \Laravel\Nova\Http\Requests\UpdateResourceRequest $request
* @return \Illuminate\Http\JsonResponse
*/
public function handle(UpdateResourceRequest $request)
{
$request->findResourceOrFail()->authorizeToUpdate($request);
$resource = $request->resource();
$resource::validateForUpdate($request);
$model = DB::transaction(function () use ($request, $resource) {
$model = $request->findModelQuery()->lockForUpdate()->firstOrFail();
if ($this->modelHasBeenUpdatedSinceRetrieval($request, $model)) {
return response('', 409)->throwResponse();
}
[$model, $callbacks] = $resource::fillForUpdate($request, $model);
// code untuk kelola sebelum penyimpanan
// AnotherModel::update();
ActionEvent::forResourceUpdate($request->user(), $model)->save();
$model->save();
// code untuk kelola setelah penyimpanan
// AnotherModel::update();
collect($callbacks)->each->__invoke();
return $model;
});
return response()->json([
'id' => $model->getKey(),
'resource' => $model->attributesToArray(),
'redirect' => $resource::redirectAfterUpdate($request, $request->newResourceWith($model)),
]);
}
/**
* Determine if the model has been updated since it was retrieved.
*
* @param \Laravel\Nova\Http\Requests\UpdateResourceRequest $request
* @param \Illuminate\Database\Eloquent\Model $model
* @return bool
*/
protected function modelHasBeenUpdatedSinceRetrieval(UpdateResourceRequest $request, $model)
{
$column = $model->getUpdatedAtColumn();
if (! $model->{$column}) {
return false;
}
return $request->input('_retrieved_at') && $model->usesTimestamps() && $model->{$column}->gt(
Carbon::createFromTimestamp($request->input('_retrieved_at'))
);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment