Laravel-多次使用控制器


Laravel - Using controller multiple times

我正在将页面转换为Laravel。我曾经有一个PHP脚本(GET)来处理任何表中的选择查询。我所要做的就是发送 table 参数,它会返回结果。

这个想法是有一个这样的控制器:

<?php
namespace App'Http'Controllers;
use Illuminate'Http'Request;
use App'Http'Requests;
use DB;
class Projects extends Controller
{
    /**
     * Get projects based on the table
     *
     * @return Response
     */
    public function index($table)
    {
        $result = DB::select("SELECT projectid FROM `" . $table . "` WHERE isClass=1 LIMIT 10");
        return view('pages.allviews', ['results' => $result]);
    }
}

问题是页面将执行此查询三次。碰巧,控制器将在执行后立即创建视图,唯一的解决方案是在控制器中重复查询三次。

我想避免这样做,我想将控制器与页面需要的内容分开,并能够在页面需要的时间执行它。概括是关键。

有没有办法做到这一点,并在不必创建新的控制器的情况下保持这种抽象?

有很多

方法可以做到这一点,但最重要的是,您应该将查询逻辑从控制器提取到单独的类中,以便可以重用该对象。基本上,存储库类对此有好处,但也可以创建查询对象。无论如何,让我们保持简单。因此,正如我所提到的,您有很多选择,根据您的项目,您可以决定策略。

在您的情况下,您可以简单地使用 DB::table() 方法并将其缓存一段时间,以便对于接下来的后续调用,将返回缓存的结果。立即查看考试:

$limit = 10;
$table = 'users';
$select = ['id', 'name'];
$result = 'Cache::remember($table, 60, function() use ($table, $select, $limit) {
    return 'DB::table($table)->limit($limit)->get($select);
});

然后,要访问缓存的查询,您可以使用以下内容:

if('Cache::has('users')) {
    $users = 'Cache::get('users');
}

因此,虽然这可能会解决您的问题,但我建议您创建一个单独的类并将该查询逻辑(带缓存)保留在该类中,例如:

namespace Some'Namespace;
use DB, Cache;
class CachedQuery {
    public function getResult($table, $select = '*', $limit = 10, $timeout = 60)
    {
        return Cache::remember($table, $timeout, function() use ($table, $select, $limit) {
            return DB::table($table)->limit($limit)->get($select);
        });
    }
}

然后像这样使用它:

use Some'Namespace'CachedQuery;
class SomeController extends Controller {
    public function index(CachedQuery $cachedQuery, $table)
    {
        // The $table parameter is required, rest are optional
        $result = $cachedQuery->getResult($table, ['projectid']);
    }
}

此外,还可以使用 IoC/服务容器对象临时存储数据。此外,可以创建一个接口并将接口绑定到类以从服务容器获取它,但我尽可能保持简单。希望你明白了。另外,请检查缓存组件。