Laravel模型控制器依赖注入

问题描述 投票:0回答:1

我有以下问题。我希望我的方法并非完全错误,随时提出建议。

我有一个Model类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);
}

我在这里设置了属性skiptake

然后,我有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函数然后通过访问器获取值并使用mutator设置值。

索引方法然后只是读取此值。

所以意思是:我显示聊天窗口(可能是评论窗口导致这个不是真正的聊天),索引方法被调用。

索引方法根据查询读取值并显示注释。 - >这个还可以

现在,什么不起作用:

当我单击按钮时,调用loadMore函数,设置索引方法然后根据它们读取和重新加载的值。

我尝试了什么:我尝试使用loadMore方法来显示自己的值(已更改)并返回它们,但是我有一条重新加载聊天的新路由,这不是我想要的。

我错过了什么?我的方法好吗? (我知道javascript可能对此更好,但我想要一个Laravel方式,获取和发布。)

提前致谢。

laravel oop laravel-5 dependency-injection
1个回答
2
投票

您的控制器功能在完全独立的请求中执行。

所有return redirect('/dashboard');都在loadMore()中将您的浏览器发送到仪表板路线。然后你的浏览器向你的控制器再次实例化的index()发出一个新请求,它的__construct()函数再次运行,一个新的空Chat模型被实例化。

我建议你把take和skip参数放到你的网址中,如下所示:

$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'));
}
© www.soinside.com 2019 - 2024. All rights reserved.