Laravel Model Controller Внедрение зависимостей - PullRequest
0 голосов
/ 07 сентября 2018

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

У меня есть модель класса 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.

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

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

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

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

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

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

1 Ответ

0 голосов
/ 07 сентября 2018

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

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

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

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

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

public function index($skip, $take)

Таким образом, он будет работать, однако еще лучше будет использовать функцию paginate() Laravel: 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'));
}
...