2016-07-26 60 views
1

对不起,我的英语。超薄型号db实例

堆栈:Slim 3框架+ Eloquent ORM。 雄辩正如Slim所期望的那样运作。

我想使用MVC模式的排序,其中薄控制器脂肪模型(所有的数据库查询等重逻辑)。

我所发现的是如何使用它的路线是这样的:

$app->get('/loans', function() use ($app) { 
    $data = DB::table('loan_instalment')->get(); // works 
    $data = $this->db->table('loan_instalment')->get(); // works 
    ... 
} 

我想是调用从choosen模型的公共方法的能力,这样的事情:

use \src\models\Instalment; 
$app->get('/loans', function() use ($app) { 
    $data = $this->model('Instalment')->getSomething(12); 
    ... 
} 

和型号类是:

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 
} 

我的应用程序看起来像basic Slim skeleton,雄辩设置:

$capsule = new \Illuminate\Database\Capsule\Manager; 
$capsule->addConnection($container['settings']['db']); 
$capsule->setAsGlobal(); 
$capsule->bootEloquent(); 


$container['db'] = function ($container) use ($capsule){ 
    return $capsule; 
}; 

这可能吗?

+0

是。但这里没有问题。 – geggleto

+0

问题很明显。怎么做 ? –

回答

0

您可以使用Slim的可变性来使用控制器。

做一个基本的控制器:

// BasicController.php 
<?php  
namespace src\Controllers; 

class BasicController 
{ 

    public function model(string $model) 
    { 
     return new $model(); 
    } 

} 

,然后在你的控制器扩展此类并将其添加到超薄容器

//SomeController.php 
<?php 
namespace src\Controllers; 

use \Psr\Http\Message\ServerRequestInterface as Request; 
use \Psr\Http\Message\ResponseInterface as Response; 

use \src\models\Instalment as Instalment; 

class SomeController extends BasicController 
{ 
    public function index(Request $request, Response $response, $args) 
    { 
     $this->model(Instalment::class)->getSomethingOutOfDB; 

     //do something else 
    } 
} 


... 
//container.php 
use \Slim\Container as Container; 

$container[\src\Controllers\HomeController::class] = function(Container $container) { 
    return new \src\Controllers\Homecontroller(); 
} 
... 


... 
//routes.php 
$app->get('/someroute', \src\Controllers\HomeController::class . ':index'); 
... 

另一种可能性是通过扩展您的\修身\应用程序:

//newApp.php 
namespace scr\App 

class newApp extends \Slim\App 
{ 
    public function model(string $model) 
     { 
      return new $model(); 
     } 
} 

我实际上会反对这两种方法的建议,而不是加载您的这种模式,因为这被认为是不好的做法。

它只是为了更好地使用:

//routes.php 
... 
use src\Models\Instalment; 
... 

... 
$app->get('/someroute', function() { 
    $instalment = new Instalment(); 
    // do something with it... 
}); 
1

如果你想使用MVC模式,你需要做的基本控制器。

<?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; 
}; 

强烈推荐机型

<?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); 

它看起来更清洁的路线,不是吗?

更多教程:

  1. My Blog
  2. Rob Allen's Blog
+0

静态功能 - 不好的做法。 –

+0

@NikitaP为什么静态函数是一个不好的习惯? –