Вызов класса: метод вместо функции обратного вызова phpslim3 - PullRequest
0 голосов
/ 17 мая 2018

Большинство примеров использования phpslim3 выглядит так

$app->get('/hello/{name}', function ($request, $response, $args) { ... });

Но вместо того, чтобы просто писать код внутри скобок обратного вызова, я предпочитаю создать класс с разделенными функциями;

Дело в том, что мой код не работает. Мой ответ только:

Сообщение: Callable Api \ CreateAccountController не существует Файл: C: \ Users \ dedeu \ Documents \ Work \ php \ l21-api-slim \ vendor \ slim \ slim \ Slim \ CallableResolver.php
Линия: 90

Я уже проверил файлы этой документации, но тоже не работает (работает, но я делаю что-то не так)

https://www.slimframework.com/docs/v3/objects/router.html#post-route

composer.json

"autoload-dev": {
    "psr-4": {
        "Tests\\": "tests/",
        "App\\": "src/",
        "Api\\": "src/Api/"
    }
},
"autoload": {
    "psr-4": {
        "Api\\": "src/Api/"
    }
},

router.php

<?php

use Slim\Http\Request;
use Slim\Http\Response;
use Api\CreateAccountController;

// Routes

// $app->get('/[{name}]', function (Request $request, Response $response, array $args) {
//     // Sample log message
//     $this->logger->info("Slim-Skeleton '/' route");


$app->post('/api/moip/create-account', \Api\CreateAccountController::class . ':create');

dependencies.php

<?php
// DIC configuration

$container = $app->getContainer();

// view renderer
$container['renderer'] = function ($c) {
    $settings = $c->get('settings')['renderer'];
    return new Slim\Views\PhpRenderer($settings['template_path']);
};

// monolog
$container['logger'] = function ($c) {
    $settings = $c->get('settings')['logger'];
    $logger = new Monolog\Logger($settings['name']);
    $logger->pushProcessor(new Monolog\Processor\UidProcessor());
    $logger->pushHandler(new Monolog\Handler\StreamHandler($settings['path'], $settings['level']));
    return $logger;
};


$container['CreateAccountController'] = function($c) {
    $view = $c->get("view"); // retrieve the 'view' from the container
    return new \Api\CreateAccountController($view);
};

CreateAccountController.php

<?php

namespace Api;

class CreateAccountController
{

    protected $view;

    public function __construct(\Slim\Views\Twig $view) {
        $this->view = $view;
    }

    public function create($request, $response, $args) {

        $data = $request->getParsedBody();
        $status = $response->getStatusCode();

        if(!isset($data["teste"])){
            // print_r('rara rasputin');
            $out = array('message' => 'you lack infos', 'code' => 400);
            $response = $response->withJson($out, 400);
            return $response;
        }

        $response = $response->withJson($data, 201);
        return $response;

    }
}

Код может выглядеть как-то неаккуратно, потому что я пытался сделать что-нибудь, чтобы это работало. (уже пытался переключить \ Api \ CreateAccountController на \ CreateAccountController

Мой путь к проекту

enter image description here

1 Ответ

0 голосов
/ 17 мая 2018

Измените composer.json

"autoload-dev": {
    "psr-4": {
        "App\\Test\\": "tests"
    }
},
"autoload": {
    "psr-4": {
        "App\\": "src"
    }
},

Запустите composer update, чтобы убедиться, что все настройки применяются.

Скопируйте файл CreateAccountController.php в src/Api/

Изменить CreateAccountController.php

<?php

namespace App\Api;

Затем исправьте запись контейнера следующим образом:

$container[\App\Api\CreateAccountController::class] = function($c) {
// ...
}
...