Php Slim Framework 3-在全局模板中使用路由器

Php Slim Framework 3-在全局模板中使用路由器,php,slim,Php,Slim,我对Slim Framework 3比较陌生。我试图理解的一件事是如何在“全局”模板中使用路由器,$this->router 我的意思是,这是一个模板,比如导航菜单——出现在每个页面上的东西 对于模板,我使用的“php视图”库与我安装的相同: composer需要slim/php视图 在我的templates目录中,我有一个名为nav.php的文件,我想在其中输出我的链接 我知道怎么这样叫路由器 <a href="<?=$router->pathFor('sign-up')?&

我对Slim Framework 3比较陌生。我试图理解的一件事是如何在“全局”模板中使用路由器,
$this->router

我的意思是,这是一个模板,比如导航菜单——出现在每个页面上的东西

对于模板,我使用的“php视图”库与我安装的相同:

composer需要slim/php视图

在我的templates目录中,我有一个名为
nav.php
的文件,我想在其中输出我的链接

我知道怎么这样叫路由器

<a href="<?=$router->pathFor('sign-up')?>">Sign Up</a>

但是。。。示例教程仅显示如何从一个单独的位置传递该链接,例如
$app->get('/sign-up'…})->setName(“sign-up”)

如何在任何模板中全局使用路由器,而不将其作为参数传递到每个单独的URL路由中


我更熟悉像CakePHP这样的框架,其中有一个“AppController”,它允许您全局设置内容,即在每个请求中都可用。我不知道Slim中是否是这样做的,但这就是我想要的效果。

您应该创建一个新类,例如MainMenu,在那里您应该创建一个包含菜单所有路径的数组。
main菜单的对象应返回带有标签和路径的数组,然后您可以将该数组传递给视图:

$menu = (new MainMenu())->buildMenu();
$response = $this->view->render($response, "index.phtml", [
    'menu' => $menu
]);
然后在
*.phtml
文件中,您可以访问
$菜单
变量。但是,如果您不想在每条路线中重复该代码,该怎么办

使用。您可以使用

$request = $request->withAttribute('foo', 'bar');
取回

$foo = $request->getAttribute('foo');

您应该创建一个新类,例如MainMenu,并在那里创建一个包含菜单所有路径的数组。
main菜单的对象应返回带有标签和路径的数组,然后您可以将该数组传递给视图:

$menu = (new MainMenu())->buildMenu();
$response = $this->view->render($response, "index.phtml", [
    'menu' => $menu
]);
然后在
*.phtml
文件中,您可以访问
$菜单
变量。但是,如果您不想在每条路线中重复该代码,该怎么办

使用。您可以使用

$request = $request->withAttribute('foo', 'bar');
取回

$foo = $request->getAttribute('foo');
好吧,你可以把它作为一个考试及格

在容器中实例化或注册
PhpRenderer
时,可以使用多个选项定义“全局”变量,即在所有模板中均可访问的变量:

// via the constructor
$templateVariables = [
    "router" => "Title"
];
$phpView = new PhpRenderer("./path/to/templates", $templateVariables);

// or setter
$phpView->setAttributes($templateVariables);

// or individually
$phpView->addAttribute($key, $value);
假设您正在通过Pimple注册
PhpRenderer

<?php
// Create application instance
$app = new \Slim\App();

// Get container
$container = $app->getContainer();

// Register PhpRenderer in the container
$container['view'] = function ($container) {

    // Declaring "global" variables
    $templateVariables = [
        'router' => $container->get('router')
    ];

    // And passing the array as second argument to the contructor
    return new \Slim\Views\PhpRenderer('path/to/templates/with/trailing/slash/', $templateVariables);
};
好吧,您可以将其传递为

在容器中实例化或注册
PhpRenderer
时,可以使用多个选项定义“全局”变量,即在所有模板中均可访问的变量:

// via the constructor
$templateVariables = [
    "router" => "Title"
];
$phpView = new PhpRenderer("./path/to/templates", $templateVariables);

// or setter
$phpView->setAttributes($templateVariables);

// or individually
$phpView->addAttribute($key, $value);
假设您正在通过Pimple注册
PhpRenderer

<?php
// Create application instance
$app = new \Slim\App();

// Get container
$container = $app->getContainer();

// Register PhpRenderer in the container
$container['view'] = function ($container) {

    // Declaring "global" variables
    $templateVariables = [
        'router' => $container->get('router')
    ];

    // And passing the array as second argument to the contructor
    return new \Slim\Views\PhpRenderer('path/to/templates/with/trailing/slash/', $templateVariables);
};



这可能是最好的方法。如果在容器工厂中设置渲染器,则可以从容器中获取路由器实例,并将其作为模板传递到渲染器中variable@geggleto问题是它将整个路由器对象传递到每个模板中。如果我做
var\u转储($router)在我的模板中有一个巨大的数组,其中包含我不需要的东西-包括DB凭据。不确定是否有一种更有效的方法可以做到这一点,即只访问命名路由?因为默认情况下对象是通过引用传递的,所以在该解决方案中没有性能损失。如果你有很多非原始的模板,请考虑使用:使用Tigg库,它比150行单类<代码> PPREDERDER < /代码>要强大得多。PhpRenderer是让人们使用模板的捷径。若你们已经达到了开发的这个阶段,那个么细枝模板就更有意义了。。。虽然我将在接下来的几个月里在PHP视图中构建更多功能,但这可能是最好的方法。如果在容器工厂中设置渲染器,则可以从容器中获取路由器实例,并将其作为模板传递到渲染器中variable@geggleto问题是它将整个路由器对象传递到每个模板中。如果我做
var\u转储($router)在我的模板中有一个巨大的数组,其中包含我不需要的东西-包括DB凭据。不确定是否有一种更有效的方法可以做到这一点,即只访问命名路由?因为默认情况下对象是通过引用传递的,所以在该解决方案中没有性能损失。如果你有很多非原始的模板,请考虑使用:使用Tigg库,它比150行单类<代码> PPREDERDER < /代码>要强大得多。PhpRenderer是让人们使用模板的捷径。若你们已经达到了开发的这个阶段,那个么细枝模板就更有意义了。。。虽然我将在接下来的几个月里在PHP视图中构建更多的功能,但这是一项伟大的工作!这对我来说非常有效!完全使用了$link->pathFor();但是$link->baseUrl()不起作用!怎么走这条路?干得好!这对我来说非常有效!完全使用了$link->pathFor();但是$link->baseUrl()不起作用!如何使这条路正确?