PHP Slim 3 - Доступ к экземплярам объектов класса в пределах тонкого маршрута - PullRequest
0 голосов
/ 08 октября 2018

Итак, я учусь писать приложение для аутентификации Slim 3 PHP и использую пример структуры кода, чтобы начать работу.В примере кода есть файл dependencies.php, в котором есть ряд функций, которые создают экземпляры объектов других классов.Затем они присваиваются переменной $ 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;
};

Эти функции затем как-то вызываются в моих тонких маршрутах.Например, в моем register.php slim маршруте объект класса validate_sanitize вызывается с помощью простого

$this->get(‘validate_sanitize’); 

и присваивается переменной, которую я затем могу использовать для вызова методов из класса validate_sanitize.

Однако я не понимаю, как этот метод get работает при вызове объекта класса из файла dependencies.php.

Вот вышеупомянутый маршрут регистрации, который является почтовым запросом для входящих данных формы:

$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);
 });

Все мои маршруты содержатся в файле rout.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';

Существует также файл начальной загрузки, который создает новый контейнер Slim, экземпляр Slim App, а также включает необходимые файлы.Я также не совсем уверен, что такое Slim \ Container или что он делает.Этот файл начальной загрузки выглядит следующим образом:

<?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, но они по-разному работают с контроллерами, что просто добавляет мне сложности и путаницы.Я бы предпочел пояснить этот конкретный пример, так как нахожу структуру кода довольно простой.

Спасибо.

1 Ответ

0 голосов
/ 15 октября 2018

Внутри вызываемого маршрута $this будет указывать на $container экземпляр.

В Slim 3.0, если вы посмотрите на map() метод класса Slim\App, вы увидите следующий код:

if ($callable instanceof Closure) {
   $callable = $callable->bindTo($this->container);
}

bindTo () - это то, что дает вам доступ к контейнеру внутри вызываемого маршрута с помощью переменной $this.

Если вы хотите использовать класс в качестве обработчика маршрута и хотите получить доступ к экземпляру контейнера внутри класса, вам нужно передать его вручную.Например,

<?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 в контейнере зависимостей, он пытается создать их и передать экземпляр контейнера.

...