【问题标题】:Slim framework Message: Callable Homecontroller does not existSlim 框架消息:Callable Homecontroller 不存在
【发布时间】:2017-12-09 00:54:50
【问题描述】:

Project Structure


public/index.php

<?php


require __DIR__ . '/../vendor/autoload.php';

ini_set('display_errors', 'On');

if (PHP_SAPI == 'cli-server') {
    // To help the built-in PHP dev server, check if the request was actually for
    // something which should probably be served as a static file
    $url  = parse_url($_SERVER['REQUEST_URI']);
    $file = __DIR__ . $url['path'];
    if (is_file($file)) {
        return false;
    }
}



session_start();

// Instantiate the app
$settings = require __DIR__ . '/../src/settings.php';



$app = new \Slim\App($settings);

// Set up dependencies
require __DIR__ . '/../src/dependencies.php';

// Register middleware
require __DIR__ . '/../src/middleware.php';

// Register routes
require __DIR__ . '/../src/routes.php';

// Run app
$app->run();

这里有 composer.json

{

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

"require": {
    "php": ">=5.5.0",
    "slim/slim": "^3.1",
    "slim/php-view": "^2.0",
    "monolog/monolog": "^1.17",
    "illuminate/database": "~5.1",
    "slim/twig-view": "^2.3"
},
"require-dev": {
    "phpunit/phpunit": ">=4.8 < 6.0"
},

"autoload-dev": {
    "psr-4": {
        "Tests\\": "tests/"
    }
},
"config": {
    "process-timeout" : 0
},
}

这是我的控制器,我在命名空间中出现错误,并且在我看到的所有示例中都使用了这个......我不知道该怎么做更多

<?php

namespace \App\Controllers;

class Homecontroller
{
    protected $container;

    // constructor receives container instance
    public function __construct(ContainerInterface $container) {
        $this->container = $container;
    }

    public function home($request, $response, $args) {
        echo "locura";
        // your code
        // to access items in the container... $this->container->get('');
        return $response;
    }

    public function contact($request, $response, $args) {
        // your code
        // to access items in the container... $this->container->get('');
        return $response;
    }
}

实际配置 在我的 routes.php 中我放了这个:

$app->get('/new', \Homecontroller::class . ':home');

配置前

在上面的代码中,我尝试将控制器创建到容器中,然后使用

$app->get('/new', '\HomeController:home');

我在 dependencies.php 中输入了这段代码:

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

};

但是我没有通过任何配置获得任何结果


我想从路由器加载 HomeController

这是我放 api.powertv/new

时遇到的错误
 Type: RuntimeException
 Message: Callable Homecontroller does not exist
File:       /Users/alfonso/Sites/powertv_api/vendor/slim/slim/Slim/CallableResolver.php
Line: 90

我来了,我把这篇文章当作我的最后一个资源,如果失败我不知道我要做什么。

【问题讨论】:

  • 如果你指的是controllers目录,相对路径是:src/controllers。如何准确地添加另一行?
  • 我很高兴你试图帮助我,但它不起作用:(
  • 阅读这部分作曲家文档getcomposer.org/doc/04-schema.md#classmap我想这会有所帮助。
  • 感谢来源。我要读它:)
  • 注意大小写。 HomecontrollerHomeController.

标签: php routes slim


【解决方案1】:

尝试在您的:

中使用绝对命名空间路径
  1. dependencies.php

    $container['yourController'] = function ($c) { $view = $c['view']; 返回新的 \App\Controllers\YourController($view); }
  2. routes.php

    $app->get('your_defined_route_name', \App\Controllers\YourController::class . ':YourControllerMethod');

【讨论】:

  • 这是我第一次在浏览器中收到另一个错误: 类型:错误消息:未定义的常量 'App\controllers' 文件:/Users/alfonso/Sites/powertv_api/src/Controllers/HomeController .php 行:5。那个常量是命名空间,所以我想现在我必须修改composer.json ??但是怎么做?
  • compose.json 很好,如果我把它放在 routes.php $app->get('/new', '\App\controllers\HomeController:home');在第 3 行的家庭控制器中:命名空间 App\controllers;它对我有用,谢谢。问题是命名空间在第 5 行,而不是在第 3 行。
【解决方案2】:

容器内的名字和你在路由中使用的名字必须匹配 您已将容器键设置为 HomeController 并在路由中使用 \HomeController,这些字符串不相等。

自己创建字符串

$container['HomeController'] = function($c) {
    $view = $c->get("view"); // retrieve the 'view' from the container
    return new HomeController($view);
};
$app->get('/new', 'HomeController:home');

或对两者都使用::class 语法:

$container[HomeController::class] = function($c) {
    $view = $c->get("view"); // retrieve the 'view' from the container
    return new HomeController($view);
};
$app->get('/new', [HomeController::class, 'home');
// or $app->get('/new', HomeController::class . ':home');

【讨论】:

  • 我已经尝试了 2 个选项并且不起作用,我收到此错误:类型:错误消息:找不到类“HomeController”文件:/Users/alfonso/Sites/powertv_api/src/dependencies .php 行:52 我还必须说,当我使用 phpstorm 开发时,在 HomeController 中,命名空间给了我下一个错误:未定义的常量控制器。也许我这里有错误。
【解决方案3】:

随着 Pheara 的回答,我得到另一个错误,是下一个:

Type: Error
Message: Undefined constant 'App\controllers'
File:/Users/alfonso/Sites/powertv_api/src/Controllers/HomeController.php
Line: 5

错误的痕迹如下:

 /Users/alfonso/Sites/powertv_api/vendor/composer/ClassLoader.php(444):   include()
#1  /Users/alfonso/Sites/powertv_api/vendor/composer/ClassLoader.php(322):   Composer\Autoload\includeFile('/Users/alfonso/...')
#2 [internal function]: Composer\Autoload\ClassLoader- >loadClass('App\\Controllers...')
#3 [internal function]: spl_autoload_call('App\\Controllers...')
#4 /Users/alfonso/Sites/powertv_api/vendor/slim/slim/Slim/CallableResolver.php(89): class_exists('App\\Controllers...')
#5 /Users/alfonso/Sites/powertv_api/vendor/slim/slim/Slim/CallableResolver.php(67): Slim\CallableResolver->resolveCallable('App\\Controllers...')
#6 /Users/alfonso/Sites/powertv_api/vendor/slim/slim/Slim/CallableResolverAwareTrait.php(45): Slim\CallableResolver->resolve('App\\Controllers...')
#7 /Users/alfonso/Sites/powertv_api/vendor/slim/slim/Slim/Route.php(330): Slim\Routable->resolveCallable('App\\Controllers...')
#8 /Users/alfonso/Sites/powertv_api/vendor/slim/slim/Slim/MiddlewareAwareTrait.php(117): Slim\Route->__invoke(Object(Slim\Http\Request), Object(Slim\Http\Response))
#9 /Users/alfonso/Sites/powertv_api/vendor/slim/slim/Slim/Route.php(313): Slim\Route->callMiddlewareStack(Object(Slim\Http\Request), Object(Slim\Http\Response))
#10 /Users/alfonso/Sites/powertv_api/vendor/slim/slim/Slim/App.php(495): Slim\Route->run(Object(Slim\Http\Request), Object(Slim\Http\Response))
#11 /Users/alfonso/Sites/powertv_api/vendor/slim/slim/Slim/MiddlewareAwareTrait.php(117): Slim\App->__invoke(Object(Slim\Http\Request), Object(Slim\Http\Response))
#12 /Users/alfonso/Sites/powertv_api/vendor/slim/slim/Slim/App.php(388): Slim\App->callMiddlewareStack(Object(Slim\Http\Request), Object(Slim\Http\Response))
#13 /Users/alfonso/Sites/powertv_api/vendor/slim/slim/Slim/App.php(296): Slim\App->process(Object(Slim\Http\Request), Object(Slim\Http\Response))
#14 /Users/alfonso/Sites/powertv_api/public/index.php(39): Slim\App->run()
#15 {main}

为了解决这个错误,你必须把命名空间放在第 3 行:

<?php 

namespace [yournamespace]

//rest of your controller

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多