2016-07-26 58 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爲什麼靜態函數是一個不好的習慣? –