我正在try 使用SLIM和下面的是我的家庭控制器来构建一个项目
HomeController.php个
<?php
namespace Controllers;
use DI\Container;
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use Slim\Views\Twig;
class HomeController extends Controller{
private $db;
private $view;
private $container;
public function __construct(Container $container){
$this->container = $container;
$this->db = $container->get('db');
$this->view = $container->get('view');
}
public function index(Request $request, Response $response, $args){
echo $this->test; // 'hello world'; This is from Controller.php
echo $this->container->get('container-test'); // I am from container is the string i pass is container and i am getting output.
echo $this->container_from_controller?'Captured':'Not Captured'; // Not Captured i.e the container in Controller.php is empty
return $this->view->render($response, 'home/index.html', [
'name' => 'from home controller'
]);
}
}
Controller.php个
<?php
namespace Controllers;
use DI\Container;
class Controller{
protected $container_from_controller;
protected $test = 'hello world';
public function __construct(Container $container){
$this->container_from_controller = $container;
}
}
代码运行得很好.作为改进,我考虑将HomeController构造函数移到Controller.php,这样我就不想在每个控制器上重复构造代码.
也就是说我想搬家
$this->container = $container;
$this->db = $container->get('db');
$this->view = $container->get('view');
到Controller.php,因此我可以直接访问$This-&>视图和$This-&>db,因为我可以访问$This-&>test
但我可以看到Controller.php__构造没有执行.
我try 将Parent::Construct()放入HomeController__Construct函数,但得到的参数太少错误.
访问控制器中的容器最好的方法是什么,所以我不想重复db和view代码.
composer.json个
{
"require": {
"slim/slim": "4.*",
"slim/psr7": "^1.6",
"php-di/slim-bridge": "^3.4",
"dcblogdev/pdo-wrapper": "^2.0",
"slim/twig-view": "^3.3"
},
"autoload": {
"psr-4": {
"Controllers\\": "src/Controllers"
}
}
}
Update of codes as per hakre answer个
我将控制器重命名为BaseController,这更有意义.
HomeController个
<?php
namespace Controllers;
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
class HomeController extends BaseController{
public function index(Request $request, Response $response, $args){
$sql = "SELECT * FROM list";
$rows = $this->db->rows($sql);
var_dump($rows);
return $this->view->render($response, 'home/index.html', [
'name' => 'from home controller'
]);
}
}
BaseController个
<?php
namespace Controllers;
use DI\Container;
abstract class BaseController{
protected $db;
protected $view;
public function __construct(Container $container){
$this->db = $container->get('db');
$this->view = $container->get('view');
}
}