13

ユーザー認証用のSilexphpマイクロフレームワークを使用して拡張機能を作成しようとしていますが、オートローダーを機能させることができないようです。誰かが光を当てることができますか?

私はこのようなディレクトリ構造を持っています(切り捨てられました)

usertest
|_lib
| |_silex.phar
| |_MyNamespace
|   |_UserExtension.php
|   |_User.php
|_www
  |_index.php

ブートストラップおよびフロントコントローラーとして機能するindex.phpの関連ビットは、次のようになります。

require '../lib/silex.phar';

use Silex\Application;
use MyNamespace\UserExtension;

$app = new Application();
$app['autoloader']->registerNamespace( 'MyNamespace', '../lib' );
$app->register( new UserExtension() );

ロードしようとしているクラスは次のようになります。

namespace MyNamespace;

use Silex\Application;
use Silex\ExtensionInterface;

class UserExtension implements ExtensionInterface {
    public function register( Application $app ) {
        $app['user'] = $app->share( function() use( $app ) {
            return new User();
        });
    }
}

このエラーをスローすることを除いて、すべて非常に簡単です。

Fatal error: Class 'MyNamespace\UserExtension' not found in /home/meouw/Projects/php/usertest/www/index.php on line 8

私はsymfony2に手を出し、ユニバーサルクラスローダーをセットアップするための指示に首尾よく従いましたが、この場合、私は困惑しています。私は何かが足りないのですか?どんな助けでもいただければ幸いです。

4

5 に答える 5

60

Silexの最近のバージョンでは、オートローダーは非推奨でありcomposer.json、オートローディング定義を一元化するため、ファイルを介してすべての名前空間を登録する必要があります。これは、imoがより優れたソリューションです。

例:

{
    "require": {
        "silex/silex": "1.0.*@dev"
    },
    "autoload": {
        "psr-0": {
            "MyNameSpace": "src/"
        }
    }
}

実際、最近のバージョンのSilexでオートローダーにアクセスしようとすると、次のRuntimeExceptionがスローされます。

オートローダーサービスにアクセスしようとしました。オートローダーはSilexから削除されました。Composerを使用して依存関係を管理し、自動読み込みを処理することをお勧めします。詳細については、http: //getcomposer.orgを参照してください。

于 2012-07-05T06:54:23.940 に答える
11

私が使用します

$app['autoloader']->registerNamespace('MyNamespace', __DIR__.'/../lib');
于 2011-09-29T14:20:26.433 に答える
11
Deprecated - As of 2014-10-21 PSR-0 has been marked as deprecated.
PSR-4 is now recommended as an alternative

そのため、composer.jsonでPSR-4構文を使用する必要があります

{
  "require": {
      "silex/silex": "1.0.*@dev",
  },
  "autoload": {
      "psr-4": {
          "Vendor\\Namespace\\": "/path"
      }
  }
}
于 2014-11-06T11:01:02.757 に答える
3

名前空間を登録するには、次のregisterNamespaces()ように呼び出します。

$app = new Silex\Application();

$app['autoloader']->registerNamespaces(array(
    'Symfony'          => __DIR__.'/../vendor/',
    'Panda'            => __DIR__.'/../vendor/SilexDiscountServiceProvider/src',
    'Knp'              => __DIR__.'/../vendor/KnpSilexExtensions/',
    // ...
));
于 2012-04-06T04:31:42.157 に答える
3

autoloadのセクションに適切なステートメントを追加することと、composer.json直接呼び出す名前空間を登録することの両方が、projectsフォルダーでregisterNamespace実行するまでは機能しませんでした。composer update

于 2013-12-14T10:50:32.073 に答える