Мне бы хотелось, чтобы, как только ajax-запрос отправлялся туда, где есть view ('view'), вместо того, чтобы возвращать raw view, он возвращает JSON

Как это:

/**
     * @param \Illuminate\Contracts\View\View $view
     * @return \Illuminate\Http\JsonResponse
     */
    protected function ajaxResponse (View $view)
    {
        return response()->json([
            'id' => $view->getData()['page'],
            'title' => $view->getData()['title'],
            'content' => $view->renderSections()['content'],
            'replacepage' => null,
        ]);
    }

Но я абсолютно не знаю, как это сделать, я не хочу повторяться в каждом контроллере

Я попытался заменить View на мой, но он не работает, так как я хотел бы, чтобы все работало, но я не могу восстановить раздел своей страницы

<?php

namespace App\Extensions\View;

use Illuminate\View\View;

class AjaxView extends View
{
    /**
     * Get the contents of the view instance.
     *
     * @return string
     * @throws \Throwable
     */
    protected function renderContents()
    {
        if(request()->ajax()) {
            echo $this->getResponse($this->getData());
            exit;
        }

        return parent::renderContents();
    }

    /**
     * @param array $data
     * @return false|string
     */
    public function getResponse (array $data = [])
    {
        return json_encode([
            'id' => $data['page'],
            'title' => (!empty($data['title']) ? $data['title'] . ' - ' . config('app.name') : null),
            'content' => $this->renderSections()['content'],
            'replacepage' => null
        ]);
    }

}

Это возвращает следующее: https://i.imgur.com/ZOi7j7H.png

0
Azeo Rs 20 Апр 2020 в 00:33

2 ответа

Лучший ответ

Возможно, вы можете сделать это следующим образом: В app/Http/Controllers/Controller.php добавьте метод response();

protected function view($viewPath, $content, $status = 200, array $headers = [])
{
        if(request()->ajax()) {
            return response()->json($content, $status, $headers);
        }

        return view($viewPath, $content);
}

Ваши методы контроллера могут тогда использовать это так:

public function create()
{
  // logic
  return $this->view('view_path', $data);
}
0
djunehor 19 Апр 2020 в 22:12

Я изменил вашу функцию на

protected function ajaxView(string $viewPath, array $content = [], int $status = 200, array $headers = [])
    {
        $view = view($viewPath, $content);

        if(request()->ajax()) {
            dd($view->getData());
            return response()->json([
                'id' => $this->view->getData()['page'],
                'title' => $this->view->getData()['title'],
                'content' => $this->view->renderSections()['content'],
                'replacepage' => null,
            ], $status, $headers);
        }

        return $view;
    }

Но массив записей dd () пуст, если я помещаю свой dd () вне моего, если запись не пуста

0
Azeo Rs 19 Апр 2020 в 22:38