Laravel переопределить вид рендерера - PullRequest
0 голосов
/ 20 апреля 2020

Мне бы хотелось, чтобы, как только запрос ajax отправлялся туда, где есть представление ('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
        ]);
    }

}

Это возвращает:

enter image description here

Ответы [ 2 ]

0 голосов
/ 20 апреля 2020

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

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 голосов
/ 20 апреля 2020

Возможно, вы можете сделать это следующим образом: В 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);
}
...