【问题标题】:Calling Class:method instead of callback function phpslim3调用类:方法而不是回调函数phpslim3
【发布时间】:2023-03-16 04:20:01
【问题描述】:

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

我的项目路径

【问题讨论】:

    标签: php slim slim-3


    【解决方案1】:

    更改 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) {
    // ...
    }
    

    【讨论】:

    • 谢谢丹尼尔!你摇滚,工作得很好。我刚刚删除了我的容器变量,一切都很好+您建议的更改
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多