Laravel模型控制器依赖注入

时间:2018-09-07 12:03:25

标签: laravel oop laravel-5 dependency-injection

我有以下问题。我希望我的方法不是完全错误的,请随时咨询。

我有一个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设置值。

Index方法然后简单地读取此值。

所以意思是:我显示了聊天窗口(也许是注释窗口导致此对话不是真正的聊天),调用了index方法。

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

现在,什么不起作用:

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

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

我想念什么?我的方法可以吗? (我知道javascript可能对此更好,但是我想用Laravel的方式来获取和发布。)

谢谢。

1 个答案:

答案 0 :(得分: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'));
}