0

我正在努力为一个项目创建一个有效的 MVC 结构。

我正在使用什么:

这是我的代码。

容器.php

$containerBuilder = new \DI\ContainerBuilder();
$containerBuilder->useAutowiring(true);
$containerBuilder->useAnnotations(true);
$containerBuilder->addDefinitions(__DIR__ . '/container-config.php');
$container = $containerBuilder->build();

容器配置.php

use Twig\Environment;
use Twig\Loader\FilesystemLoader;
use Psr\Container\ContainerInterface;

return [

    'request' => function() {
        return Symfony\Component\HttpFoundation\Request::createFromGlobals();
    },

    'session' => function() {
        return new Symfony\Component\HttpFoundation \Session\Session();
    }

    Environment::class => function () {

        $loader = new FilesystemLoader(__DIR__ . '/../templates');
        $twig = new Environment($loader, [
            'cache' => __DIR__ . '/../var/cache/templates',
        ]);

        return $twig;
    },
];

路由器.php

use Pecee\SimpleRouter\SimpleRouter as R;
use Pecee\Http\Middleware\BaseCsrfVerifier;
use App\App;

R::csrfVerifier(new BaseCsrfVerifier());
R::setDefaultNamespace('\App\Controller');
R::enableDependencyInjection($container);

R::get('/', 'ProductController@index', ['as' => 'products']);

R::start();

这是我的基本控制器

namespace App;

use Symfony\Component\HttpFoundation\Request;
use Twig\Environment;

class BaseController
{

    protected $request;

    protected $twig;

    public function __construct(Request $request, Environment $twig)
    {

        $this->request = $request;

        $this->twig = $twig;

    }

}

最后,我的产品控制器

namespace App\Controller;

use App\BaseController;

class ProductController extends BaseController
{

    public function index()
    {

        dump($this->request); // returns the request object
        dump($this->request->query->all()); // return empty array

    }

}

第一个问题是我在容器上设置的请求对象在我的控制器中不起作用。

示例网址example.com?foo=bar

dump($this->request)

此行返回 aSymfony\Component\HttpFoundation\Request它应该,但它似乎是一个新的,因为我无法使用 获取查询参数$this->request->query->all(),它返回空。

如果我创建Symfony\Component\HttpFoundation\Request::createFromGlobals();为全局变量,它会按预期工作,并且转储$this->request->query->all()返回预期的数组。

所以我的问题是,我如何才能最好地将所有这些组件结合在一起以形成一个工作结构?

谢谢!

4

1 回答 1

0

PHP-DI 中没有任何内容表明依赖注入是根据参数名称发生的,而是类是相关的。PHP-DI 神奇地注入任何类,如果它(尚未)定义。(如果没有提供定义, AnnotationBasedAutowiring从无到有创建一个类

但是,实际上使用注释来触发注入看起来非常不同,恕我直言显然不是您想要的,或者您会这样做。

由于您的定义只包含一个 forrequest而不是 for的条目Symfony\Component\HttpFoundation\Request,因此容器会很高兴地为您创建一个条目。

要解决此问题,您必须设置一个不同的键,一个匹配的键:

use Symfony\Component\HttpFoundation\Request; // <-- added

return [
    Request::class => function() {
        return Request::createFromGlobals();
    },
    // ...
];
于 2020-07-14T13:21:03.960 回答