2016-01-05 2 views
0

Я делаю запросы Ajax для laravel - но по какой-то причине моя пользовательская функция не ускользает от специальных символов. Я не могу понять, почему. Я использовал эту ту же самую функцию в CodeIgniter, и она отлично справляется с выходом. Все данные возвращаются в файл JS хорошо, но ничего не ускользает. Вот код:Laravel - htmlentities

public function store(Request $request, $project_id) { 
    //current logged in user. 
    $user_id = auth()->user()->id; 


    //get all post inputs 

    $inputs = $request->all(); 


    //make sure project ID belongs to current user. Stop someone from adding a task to your project that isn't you. 
    $projectBelongsToUser = Project::find(1)->where('user_id', $user_id)->where('id', $project_id)->get(); 



    //if a project ID and inputs are provided - log them to the database, if not redirect to home with $errors. 
    if($project_id && $inputs['description'] && $projectBelongsToUser) { 

     $task = New Task; 

     $task->description = $inputs['description']; 
     $task->due_date = $inputs['due_date']; 
     $task->priority = $inputs['priority']; 
     $task->completed = 0; 
     $task->order  = 0; 
     $task->user_id  = $user_id; 
     $task->project_id = $project_id; 
     $task->save(); 

     //get all tasks 
     $tasks = Task::where('user_id', $user_id)->where('project_id', $project_id)->orderBy('description', 'asc')->get(); 

     //sanitize tasks for safe output 
     function sanitize_object_h($array) { 
      $array_modified = $array; 

      foreach($array_modified as $object) { 
       foreach($object as &$item) { 
        $item = htmlentities($item, ENT_QUOTES); 
       } 
       //end foreach 
      } 
      //end foreach 
      return $array_modified; 

     } 
     //end sanitize_object_h 

     $sanitized_tasks = sanitize_object_h($tasks); 

     //return the sanitized object. 
     echo json_encode(sanitize_object_h($tasks)); 

    } else { 

     echo "failed"; 
     return; 

    }//end if 



}//end store 
+0

Не знаете о вашей проблеме, но у вас есть несколько странных вещей, таких как первый проект :: find (1) ... вы выбираете 'id = 1', но используете, где' user_id = $ user_id', но и 'id = $ project_id'. Это не имеет смысла, id может быть только одним (в типичной структуре), поэтому только «Project :: find ($ project_id);». Если вы хотите, чтобы люди не пытались использовать чужие роли и разрешения, выполните следующие действия: –

+0

@BojanKogoj. Вы могли бы сделать это через middelware (роли/разрешения)? Один из них - user_id, а другой - project_id. В таблице проектов есть отношение к таблице пользователей. – john23

+0

Да, для этого я использую Entrust. Конечно, немного работы, чтобы все это работало так, как я хотел, но это того стоит, если вы спросите меня. Сохранение кода чистым и коротким. –

ответ

0

Во-первых, я не исправил выход. Htmlentities должны работать, но, на мой взгляд (и someothers) вам не нужно. Json_encode сам по себе избегает всех символов, которые ему нужны, чтобы сделать действительный JSON. Однако я попытался улучшить читаемость вашего кода.

Laravel может делать много всего, что вы хотите.

public function store(Request $request, $project_id) { 

    if(!$project_id) 
     abort(404, "Bad id"); 

    // make sure all inputs exist 
    $this->validate($request, [ 
     'description' => 'required', 
     'due_date' => 'required', 
     'priority' => 'required' 
    ]); 

    //get all post inputs 
    $inputs = $request->all(); 

    //make sure project ID belongs to current user. Stop someone from adding a task to your project that isn't you. 
    $project = Project::findOrFail($project_id); 
    if($project->user_id != Auth::user()->id) 
     abort(403, 'Not your thing'); 

    $task = New Task; 

    $task->description = $inputs['description']; 
    $task->due_date = $inputs['due_date']; 
    $task->priority = $inputs['priority']; 
    $task->completed = 0; 
    $task->order  = 0; 
    $task->user_id  = $user_id; 
    $task->project_id = $project_id; 
    $task->save(); 

    //get all tasks 
    $tasks = Task::where('user_id', $user_id)->where('project_id', $project_id)->orderBy('description', 'asc')->get(); 

    return Response::json($tasks); 
}//end store 

Посмотрите на Validation

Обратите внимание, чтобы прервать. Я думаю, что довольно очевидно, что он делает, но вы также можете использовать return "error";, если хотите, поскольку это похоже на API. FindOrFail. Если запись не существует, она выкинет 404 (если вы ее не поймаете).

+0

Спасибо Bojan - очень ценю, что вы проходите через это и предлагаете предложения. Я буду реализовывать их, и это ускорит мое время кодирования. – john23

+0

есть способ получить отладку для показа в консоли для запросов Ajax. Сейчас я получаю 500 внутренних ошибок сервера и не могу отлаживать очень легко. – john23

+0

По какой-то причине добавление return Reponse :: json ($ tasks); возвращает ошибку 500 для меня .... следовательно, вопрос отладки. – john23

Смежные вопросы