Внедрение зависимости контроллера модели Laravel

У меня следующая проблема. Надеюсь, мой подход не совсем неправильный, не стесняйтесь советовать.

У меня модель класса Chat.php

protected $skip;
protected $take;
protected $agreements;
protected $chat;


public function getSkip()
{
    return $this->skip;
}

public function setSkip($skip)
{
    $this->skip = $skip;
}

public function getTake()
{
    return $this->take;
}

public function setTake($take)
{
    $this->take = $take;
}

public function __construct(array $attributes = array())
{
    parent::__construct($attributes);

    $this->setTake(8);
    $this->setSkip(8);
}

Я задаю здесь свойства skip и take.

Затем у меня есть DashboardController

class DashboardController extends Controller
{

private $chat;

/**
 * DashboardController constructor.
 * @param $chat
 */
public function __construct(Chat $chat)
{
    $this->chat = $chat;
}


/**
 * Display a listing of the authenticated resource.
 *
 * @return \Illuminate\Http\Response
 */
public function index()
{


    $chats = Chat::orderBy('created_at','desc')->skip($this->chat->getSkip())->take($this->chat->getTake())->get();


    $agreements = AgrType::orderBy('created_at','desc')->take(10)->get();


    return view('sections.dashboard', compact('chats','agreements'));
}

public function loadMore()
{

    $this->chat->setSkip($this->chat->getSkip() - 1 );

    $this->chat->setTake($this->chat->getTake() - 1);



    return redirect('/dashboard');

}

Мой подход следующий:

После того, как пользователь нажимает кнопку, направьте /loadmore, чтобы получить его к этому контроллеру и запустить функцию loadMore.

Затем функция LoadMore получает значения через аксессоры и устанавливает значения с помощью мутатора.

Затем метод индекса просто считывает эти значения.

Итак, смысл таков: я показываю окно чата (скорее, окно комментариев, потому что это на самом деле не чат), вызывается метод index.

Метод Index считывает значения и отображает комментарии в соответствии с запросом. -> это нормально

Теперь, что НЕ работает:

Когда я нажимаю кнопку, вызывается функция loadMore, которая устанавливает значения, которые затем читает и перезагружает метод индексации в соответствии с ними.

Что я пробовал: я попробовал метод loadMore для отображения собственных значений (измененных) и их возврата, но затем у меня появился новый маршрут для перезагруженного чата, и это не то, что я хочу.

Что я скучаю? Мой подход в порядке? (Я знаю, что javascript, возможно, лучше для этого, но мне нужен способ Laravel, получить и опубликовать.)

Заранее спасибо.

Из вашего кода не очевидно, как он должен работать. Я считаю, что вам следует найти более простой способ реализовать свою идею, чтобы другие разработчики могли легко ее понять.

Prisacari Dmitrii 07.09.2018 14:26
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
0
1
142
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Функции вашего контроллера выполняются в совершенно отдельных запросах.

Все, что return redirect('/dashboard'); делает в loadMore(), отправляет ваш браузер в маршрут приборной панели. Затем ваш браузер делает новый запрос к index(), на котором ваш контроллер снова создается, его функция __construct() запускается снова, и создается новая пустая модель Chat.

Я рекомендую вам указать параметры take и skip в своем URL-адресе следующим образом:

$router->get('/dashboard/{skip}/{take}', 'DashboardController@index');

И измените свою функцию index() на это:

public function index($skip, $take)

Таким образом, это будет работать, однако даже лучший способ сделать это - использовать функцию Laravel paginate(): https://laravel.com/docs/5.6/pagination

public function index()
{
    $chats = Chat::orderBy('created_at','desc')->paginate();

    $agreements = AgrType::orderBy('created_at','desc')->take(10)->get();

    return view('sections.dashboard', compact('chats','agreements'));
}

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

chazecka 07.09.2018 14:50

Нет проблем, это должно сработать.

Daniel Eisenhardt 07.09.2018 18:29

да, разбивка на страницы работает, спасибо, не совсем то, что я хотел, но я понял.

chazecka 08.09.2018 13:13

Другие вопросы по теме