Slim Model数据库实例 [英] Slim Model db instance

查看:483
本文介绍了Slim Model数据库实例的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

对不起,我的英语.

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?

更多教程:

  1. 我的博客
  2. 罗伯·艾伦的博客
  1. My Blog
  2. Rob Allen's Blog

这篇关于Slim Model数据库实例的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆