从模型中去掉这个逻辑。
为 Postgres 创建一个仓库,我们称之为 PostgresTokenRepository。此存储库的构造函数应如下所示...
<?php
class PostgresTokenRepository implements TokenRepositoryInterface
{
protected $token;
public function __construct(Token $token)
{
$this->token = $token;
}
public function getTokens()
{
return $this->token->whereRaw('(extract(epoch from t.created_at) + t.expires) < extract(epoch from NOW())')->get();
}
}
你需要一个接口...TokenRepositoryInterface
interface TokenRepositoryInterface
{
public function getTokens();
}
现在,就存储库而言,您应该已准备就绪。如果您需要执行 MySQL 实现,只需创建一个看起来相似的 MysqlTokenRepository,除了 getTokens() 函数将使用 UNIX_TIMESTAMP()。
现在你需要告诉 Laravel,当你在寻找 TokenRepositoryInterface 的实现时,它应该是 return PostgresTokenRepository。为此,我们需要创建一个服务提供者。
<?php
class UserServiceProvider extends \Illuminate\Support\ServiceProvider
{
public function register()
{
$this->app->bind('TokenRepositoryInterface', 'PostgresTokenRepository');
}
}
现在唯一要做的就是将此服务提供者添加到config/app.php 中的服务提供者数组中。
现在,当您在控制器中需要此存储库时,您可以让它们自动注入。这是一个例子......
class TokenController extends BaseController
{
protected $token;
public function __construct(TokenRepositoryInterface $token)
{
$this->token = $token;
}
public function index()
{
$tokens = $this->token->getTokens();
return View::make('token.index')->with('tokens', $tokens);
}
}
这样做的目的是当你想开始使用MySQL实现时,你所要做的就是修改服务提供者返回MysqlTokenRepository而不是PostgresTokenRepository。或者如果你想一起编写一个新的实现,这一切都是可能的,而无需更改生产代码。如果某些东西不起作用,只需将这一行改回PostgresTokenRepository。
另一个卖给我的好处是,这使您能够保持模型和控制器非常轻巧且非常可测试。