【问题标题】:Silex 'App\Controller\IndexController' not found on server在服务器上找不到 Silex 'App\Controller\IndexController'
【发布时间】:2015-09-18 21:00:03
【问题描述】:

我的 silex 项目在本地工作,但是当我把它放到网上时,我遇到了 NameSpace 或 Class 解析问题:

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

结构:

/  
->myfolder  
    ->app
        ->controller
           ->IndexController.php
        ->bootstrap.php
        ->...
    ->vendor
    ->web
        ->.htaccess
        -> index.php
        -> ...

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"
 }
} 

.htaccess

<IfModule mod_rewrite.c>
    Options -MultiViews

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

</IfModule>

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;  

IndexController.php

namespace App\Controller {


use Silex\Application;
use Silex\ControllerProviderInterface;

class IndexController implements ControllerProviderInterface
{
...

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

【问题讨论】:

  • 您的命名空间中有appcontroller 文件夹,而不是AppController
  • 我已经考虑过了,但我不确定这是命名空间和文件夹名称之间的链接
  • 您使用的是什么操作系统?在linux上,文件系统是区分大小写的,因此app和App是不同的目录。
  • 你的 RewriteBase 是错误的,rewritebase 是相对于 URI 而不是文件系统(好吧,也是文件系统,但取决于你的 webroot 文件夹)。 Take a look at this。 PS:确保您的 webroot 是 web 文件夹,而不是 myfolder 文件夹,否则您将可以从任何地方直接访问所有项目文件
  • 是的,如果您的 webroot 是 myfolder 文件夹,那么您肯定需要一个 htaccess 来禁止访问所有非公共文件夹。

标签: php .htaccess silex


【解决方案1】:

@Maerlyn “你有文件夹 app 和 controller,而不是你的命名空间中的 App 和 Controller。”

这让我走上了正轨!

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

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

使用此功能,您可以映射您的命名空间和文件夹:

 "autoload": {
    "psr-4": {
      "App\\Controller\\": "./app/controller"
    }
  },

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

您可以在 vendor => composer => autoload_psr4 文件中找到生成的代码

return array(
    ...
    'App\\Controller\\' => array($baseDir . '/app/controller'),
);

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

【讨论】:

  • 不错,没想到换psr4 :)
猜你喜欢
  • 2018-05-09
  • 2014-09-23
  • 2015-09-29
  • 1970-01-01
  • 2015-12-04
  • 2020-04-13
  • 2012-08-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多