PHP Slim 3 - 在 slim 路由中访问 class 对象实例
PHP Slim 3 - Accessing class object instances within a slim route
所以我正在学习如何编写 Slim 3 PHP 身份验证应用程序,并且我正在使用示例代码结构来帮助我入门。示例代码有一个名为 dependencies.php 的文件,其中包含一系列创建其他 class 对象实例的函数。然后将这些分配给一个 $container 变量,每个函数都有一个名称。 dependencies.php 文件中这些函数的示例可在此处查看:
$container['view'] = function ($container) {
$view = new \Slim\Views\Twig(
$container['settings']['view']['template_path'],
$container['settings']['view']['twig'],
[
'debug' => true // This line should enable debug mode
]
);
$basePath = rtrim(str_ireplace('index.php', '', $container['request']->getUri()->getBasePath()), '/');
$view->addExtension(new Slim\Views\TwigExtension($container['router'], $basePath));
$view->addExtension(new \Twig_Extension_Debug());
return $view;
};
$container['validate_sanitize'] = function ($container)
{
$class_path = $container->get('settings')['class_path'];
require $class_path . 'ValidateSanitize.php';
$validator = new ValidateSanitize();
return $validator;
};
$container['hash_password'] = function($container)
{
$class_path = $container->get('settings')['class_path'];
require $class_path . 'HashPassword.php';
$hash = new HashPassword();
return $hash;
};
然后在我的 slim 路由中以某种方式调用这些函数。例如在我的 register.php
slim 路由中 validate_sanitize
class 对象被简单的
调用
$this->get(‘validate_sanitize’);
并分配给一个变量,然后我可以使用该变量从 validate_sanitize
class 调用方法。
然而我不明白的是 get
方法如何从 dependencies.php 文件调用 class 对象。
这是前面提到的注册路由,它是对传入表单数据的 post 请求:
$app->post('/register', function(Request $request, Response $response)
{
$arr_tainted_params = $request->getParsedBody();
$sanitizer_validator = $this->get('validate_sanitize'); //here for example
$password_hasher = $this->get('hash_password');
$tainted_email = $arr_tainted_params['email'];
$tainted_username = $arr_tainted_params['username'];
$tainted_password = $arr_tainted_params['password'];
$model = $this->get('model');
$sql_wrapper = $this->get('sql_wrapper');
$sql_queries = $this->get('sql_queries');
$db_handle = $this->get('dbase');
$cleaned_email = $sanitizer_validator->sanitize_input($tainted_email, FILTER_SANITIZE_EMAIL);
$cleaned_username = $sanitizer_validator->sanitize_input($tainted_username, FILTER_SANITIZE_STRING);
$cleaned_password = $sanitizer_validator->sanitize_input($tainted_password, FILTER_SANITIZE_STRING);
});
我所有的路线都包含在一个 routes.php 文件中,如下所示:
<?php
require 'routes/change_password.php';
require 'routes/forgot_password.php';
require 'routes/homepage.php';
require 'routes/login.php';
require 'routes/logout.php';
require 'routes/register.php';
还有一个 bootstrap 文件,用于创建新的 Slim 容器、Slim 应用程序实例,还包括必要的文件。我也不完全确定 Slim\Container 是什么或它有什么作用。此 bootstrap 文件如下所示:
<?php
session_start();
require __DIR__ . '/../vendor/autoload.php';
$settings = require __DIR__ . '/app/settings.php'; //an array of options containing database configurations and the path to twig templates
$container = new \Slim\Container($settings); //not sure what this does
require __DIR__ . '/app/dependencies.php';
$app = new \Slim\App($container);
require __DIR__ . '/app/routes.php';
$app→run();
我尝试阅读了很多文章并观看了各种 YouTube 视频,但它们对控制器的处理方式有所不同,这只会给我带来更多的复杂性和困惑。我更愿意对这个具体示例进行解释,因为我发现代码结构相当简单。
谢谢。
内部可调用路由,$this
将指向 $container
个实例。
在 Slim 3.0 中,如果您查看 Slim\App
class 的 map()
方法,您将看到以下代码:
if ($callable instanceof Closure) {
$callable = $callable->bindTo($this->container);
}
bindTo() 使您可以使用 $this
变量访问可调用路由内的容器。
如果你想使用class作为路由处理程序并且想访问class中的容器实例,你需要手动传递它。例如
<?php
namespace App\Controller;
class MyPostRegisterController
{
private $container;
public function __constructor($container)
{
$this->container = $container;
}
public function __invoke(Request $request, Response $response)
{
$sanitizer_validator = $this->container->get('validate_sanitize');
//do something
}
}
然后你可以定义如下路由
$app->post('/register', App\Controller\MyPostRegisterController::class);
如果 Slim 在依赖容器中找不到 MyPostController
class,它会尝试创建它们并传递容器实例。
更新
要调用其他方法,请在 class 名称后附加方法名称,以冒号分隔。例如,跟随 route registration 将调用 MyPostRegisterController class 中的方法 home()
。
$app->post('/register', App\Controller\MyPostRegisterController::class . ':home');
所以我正在学习如何编写 Slim 3 PHP 身份验证应用程序,并且我正在使用示例代码结构来帮助我入门。示例代码有一个名为 dependencies.php 的文件,其中包含一系列创建其他 class 对象实例的函数。然后将这些分配给一个 $container 变量,每个函数都有一个名称。 dependencies.php 文件中这些函数的示例可在此处查看:
$container['view'] = function ($container) {
$view = new \Slim\Views\Twig(
$container['settings']['view']['template_path'],
$container['settings']['view']['twig'],
[
'debug' => true // This line should enable debug mode
]
);
$basePath = rtrim(str_ireplace('index.php', '', $container['request']->getUri()->getBasePath()), '/');
$view->addExtension(new Slim\Views\TwigExtension($container['router'], $basePath));
$view->addExtension(new \Twig_Extension_Debug());
return $view;
};
$container['validate_sanitize'] = function ($container)
{
$class_path = $container->get('settings')['class_path'];
require $class_path . 'ValidateSanitize.php';
$validator = new ValidateSanitize();
return $validator;
};
$container['hash_password'] = function($container)
{
$class_path = $container->get('settings')['class_path'];
require $class_path . 'HashPassword.php';
$hash = new HashPassword();
return $hash;
};
然后在我的 slim 路由中以某种方式调用这些函数。例如在我的 register.php
slim 路由中 validate_sanitize
class 对象被简单的
$this->get(‘validate_sanitize’);
并分配给一个变量,然后我可以使用该变量从 validate_sanitize
class 调用方法。
然而我不明白的是 get
方法如何从 dependencies.php 文件调用 class 对象。
这是前面提到的注册路由,它是对传入表单数据的 post 请求:
$app->post('/register', function(Request $request, Response $response)
{
$arr_tainted_params = $request->getParsedBody();
$sanitizer_validator = $this->get('validate_sanitize'); //here for example
$password_hasher = $this->get('hash_password');
$tainted_email = $arr_tainted_params['email'];
$tainted_username = $arr_tainted_params['username'];
$tainted_password = $arr_tainted_params['password'];
$model = $this->get('model');
$sql_wrapper = $this->get('sql_wrapper');
$sql_queries = $this->get('sql_queries');
$db_handle = $this->get('dbase');
$cleaned_email = $sanitizer_validator->sanitize_input($tainted_email, FILTER_SANITIZE_EMAIL);
$cleaned_username = $sanitizer_validator->sanitize_input($tainted_username, FILTER_SANITIZE_STRING);
$cleaned_password = $sanitizer_validator->sanitize_input($tainted_password, FILTER_SANITIZE_STRING);
});
我所有的路线都包含在一个 routes.php 文件中,如下所示:
<?php
require 'routes/change_password.php';
require 'routes/forgot_password.php';
require 'routes/homepage.php';
require 'routes/login.php';
require 'routes/logout.php';
require 'routes/register.php';
还有一个 bootstrap 文件,用于创建新的 Slim 容器、Slim 应用程序实例,还包括必要的文件。我也不完全确定 Slim\Container 是什么或它有什么作用。此 bootstrap 文件如下所示:
<?php
session_start();
require __DIR__ . '/../vendor/autoload.php';
$settings = require __DIR__ . '/app/settings.php'; //an array of options containing database configurations and the path to twig templates
$container = new \Slim\Container($settings); //not sure what this does
require __DIR__ . '/app/dependencies.php';
$app = new \Slim\App($container);
require __DIR__ . '/app/routes.php';
$app→run();
我尝试阅读了很多文章并观看了各种 YouTube 视频,但它们对控制器的处理方式有所不同,这只会给我带来更多的复杂性和困惑。我更愿意对这个具体示例进行解释,因为我发现代码结构相当简单。
谢谢。
内部可调用路由,$this
将指向 $container
个实例。
在 Slim 3.0 中,如果您查看 Slim\App
class 的 map()
方法,您将看到以下代码:
if ($callable instanceof Closure) {
$callable = $callable->bindTo($this->container);
}
bindTo() 使您可以使用 $this
变量访问可调用路由内的容器。
如果你想使用class作为路由处理程序并且想访问class中的容器实例,你需要手动传递它。例如
<?php
namespace App\Controller;
class MyPostRegisterController
{
private $container;
public function __constructor($container)
{
$this->container = $container;
}
public function __invoke(Request $request, Response $response)
{
$sanitizer_validator = $this->container->get('validate_sanitize');
//do something
}
}
然后你可以定义如下路由
$app->post('/register', App\Controller\MyPostRegisterController::class);
如果 Slim 在依赖容器中找不到 MyPostController
class,它会尝试创建它们并传递容器实例。
更新
要调用其他方法,请在 class 名称后附加方法名称,以冒号分隔。例如,跟随 route registration 将调用 MyPostRegisterController class 中的方法 home()
。
$app->post('/register', App\Controller\MyPostRegisterController::class . ':home');