问题描述
对不起,我的英语.
stack:Slim 3框架+雄辩的ORM.雄辩的口才与Slim一样.
stack: Slim 3 framework + Eloquent ORM.Eloquent works as expected with Slim.
我想使用一种瘦控制器和胖模型(所有数据库查询和其他繁琐的逻辑)的MVC模式.
I want to use sort of a MVC pattern where thin controllers and fat models(all db queries and other heavy logic).
我发现的是如何从这样的路由中使用它:
All I found is how to use it from routes like this:
$app->get('/loans', function () use ($app) {
$data = DB::table('loan_instalment')->get(); // works
$data = $this->db->table('loan_instalment')->get(); // works
...
}
我想要的是从所选模型中调用公共方法的能力,就像这样:
What I want is ability to call public methods from choosen model, something like this:
use \src\models\Instalment;
$app->get('/loans', function () use ($app) {
$data = $this->model('Instalment')->getSomething(12);
...
}
并且Model类是:
namespace src\models;
use Illuminate\Database\Eloquent\Model as Model;
use Illuminate\Database\Capsule\Manager as DB;
class Instalment extends Model
{
protected $table = 'loan_instalment';
public function getSomething($id)
{
return $this->table->find($id);
}
// bunch of other methods
}
我的应用程序看起来像基本的Slim骨架,口语设置:
My app looks like basic Slim skeleton, Eloquent settings:
$capsule = new \Illuminate\Database\Capsule\Manager;
$capsule->addConnection($container['settings']['db']);
$capsule->setAsGlobal();
$capsule->bootEloquent();
$container['db'] = function ($container) use ($capsule){
return $capsule;
};
有可能吗?
推荐答案
如果要使用MVC模式,则需要制作基本控制器.
If you want to use MVC pattern, you need to make base controller.
<?php
namespace App\Controller;
use Slim\Container;
class BaseController
{
protected $container;
public function __construct(Container $container)
{
$this->container = $container;
}
public function getContainer()
{
return $this->container;
}
public function __get($name)
{
return $this->container->{$name};
}
public function __set($name, $value)
{
$this->container->{$name} = $value;
}
}
还有容器:
// Base Controller
$container[App\Controller\BaseController::class] = function ($c) {
return new App\Controller\BaseController($c);
};
$capsule = new \Illuminate\Database\Capsule\Manager;
$capsule->addConnection($container['settings']['db']);
$capsule->setAsGlobal();
$capsule->bootEloquent();
$container['db'] = function ($container) use ($capsule){
return $capsule;
};
强烈建议在模型上使用静态功能
Highly recommended to use static function on models
<?php
namespace App\models;
use Illuminate\Database\Eloquent\Model as Model;
use Illuminate\Database\Capsule\Manager as DB;
class Instalment extends Model
{
protected $table = 'loan_instalment';
public static function getSomething($id)
{
return Instalment::find($id);
}
}
现在您的代码变为:
<?php
use App\models\Instalment;
$app->get('/loans', function ($request, $response, $args) {
$data = Instalment::getSomething(12);
...
}
控制器:
<?php
namespace App\Controller;
use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Http\Message\ResponseInterface as Response;
use App\models\Instalment;
class HomeController extends BaseController
{
public function __invoke(Request $request, Response $response, Array $args)
{
$data = Instalment::getSomething(12);
// load the template
return $response;
}
}
以及控制器的路线
<?php
$app->get('/', App\Controller\HomeController::class);
看起来更干净,不是吗?
It looks cleaner, isn't it?
更多教程:
- My Blog
- Rob Allen's Blog
这篇关于Slim Model数据库实例的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!