在服务器上找不到Silex'App\Controller\IndexController'

Jul*_*ige 5 php .htaccess silex

我的silex项目适用于本地,但是当我把它放到网上时,我有一个NameSpace或类解析问题:

致命错误:第19行/homepages/40/d453499750/htdocs/myfolder/app/bootstrap.php中找不到类'App\Controller\IndexController'

结构体 :

/  
->myfolder  
    ->app
        ->controller
           ->IndexController.php
        ->bootstrap.php
        ->...
    ->vendor
    ->web
        ->.htaccess
        -> index.php
        -> ...
Run Code Online (Sandbox Code Playgroud)

composer.json

{
  "minimum-stability":"dev",
  "autoload": { "psr-0": { "App\\": "./" }},
  "require":{
      "silex/silex": "~1.2",
      "symfony/twig-bridge":"2.1.*",
      "twig/twig":">=1.8,<2.0-dev"
 }
} 
Run Code Online (Sandbox Code Playgroud)

的.htaccess

<IfModule mod_rewrite.c>
    Options -MultiViews

    RewriteEngine On
    RewriteBase /myfolder
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ web/index.php [QSA,L]

</IfModule>
Run Code Online (Sandbox Code Playgroud)

boostrap.php

<?php

use App\Controller\IndexController;
use Silex\Provider\TwigServiceProvider;
use Silex\Provider\UrlGeneratorServiceProvider;
use Silex\Provider;

/* load vendors */
$loader = require_once __DIR__ . '/../vendor/autoload.php';

$app = new Silex\Application();
/* unable path() and url() */
$app->register(new UrlGeneratorServiceProvider());
/* twig */
$app->register(new TwigServiceProvider());

/* load the controllers*/
$loader->add("App",dirname(__DIR__));
$app->mount("/", new IndexController());

return $app;  
Run Code Online (Sandbox Code Playgroud)

IndexController.php

namespace App\Controller {


use Silex\Application;
use Silex\ControllerProviderInterface;

class IndexController implements ControllerProviderInterface
{
...
Run Code Online (Sandbox Code Playgroud)

我的silex在一个文件夹中,但我在.htaccess中重写了基础.我做错了什么?

Jul*_*ige 4

@Maerlyn“你有文件夹应用程序和控制器,而不是像你的命名空间中的应用程序和控制器。”

这使我走上了正轨!

我已将我的文件夹重命名为首字母大写,并且成功了。但我想到了 Silex 供应商正在使用大写命名空间和小写目录名......

解决方案位于composer.json中,更准确地说位于autoload参数中。

通过此功能,您可以映射命名空间和文件夹:

 "autoload": {
    "psr-4": {
      "App\\Controller\\": "./app/controller"
    }
  },
Run Code Online (Sandbox Code Playgroud)

您可以在这里找到更多信息:
https://getcomposer.org/doc/01-basic-usage.md#autoloading

您可以在供应商=>作曲家=>autoload_psr4文件中找到生成的代码

return array(
    ...
    'App\\Controller\\' => array($baseDir . '/app/controller'),
);
Run Code Online (Sandbox Code Playgroud)

有了这个,我可以保留小写文件夹(作为 silex 默认值)和大写命名空间。