3

私はLaravelでモデルの名前を付けようとしています。また、通常のモデルがアプリ/モデルのルートで行うように、自動的に自動ロードされるようにしています。composer dump-autoload動作しますが、新しいモデルを作成した後は実行したくありません。

#app/models/MyNamespace/Thing.php
<?php
namespace App\Models\MyNamespace;
class Thing {
    // ...
}

#app/routes.php
<?php
Route::get('test', function(){
    $thing = new App\Models\MyNamespace\Thing;
});

私が実行した場合はcomposer dump-autoloadすべて問題ありませんが、それ以外の場合はクラスが見つからないという例外が発生します。

新しいクラスを作成するたびにクラスマップを再構築せずに、そのような構造を機能させるにはどうすればよいですか? PSR-0 は、名前空間がディレクトリ構造と直接相関する場所であり、クラスがそれに準拠しているように見えます...

また、うまく機能する Workbench を使用してみましたが、理想的には、app/models/MyNamespace、app/models/AnotherNamespace などを使用したいと考えています。

4

1 に答える 1

3

これは Laravel の「問題」ではありません。これは、Composer を使用するすべてのアプリケーションでまったく同じように機能するものです。

クラスが psr-0 ルールに従っている場合 (ディレクトリ構造が重要です!)、composer.json で構成できます。

{
    "autoload": {
        "psr-0": {"MyNamespace\\": "app/models"}
    }
}

実行する

composer dump-autoload

一度、autoload_namespaces.php に表示されます。その後、Composer は名前空間でクラスを見つけることができますdump-autoload。再度行う必要はありません。

それがどのように機能するかをよりよく説明するため。もしあなたがそうするなら

"psr-0": {"MyNamespace\\": "app/models"}

次のように使用する必要があります。

$user = new MyNamespace\User.php

Composer は名前空間を名前空間パスの末尾に追加し、User.php が次の場所にあると想定するためです。

/var/www/yourappdir/app/models/MyNamespace/User.php

だから、することで

"psr-0": { "App\\Models\\": "" }

/var/www/yourappdir/App/Modelsすべてのサブフォルダーに App\Models 名前空間の名前空間ファイルを含めることができることを Composer に伝えています。また、次のようなファイルをアドレス指定できます。

$user = new App\Models\User.php  
$user = new App\Models\MyNamespace\User.php  
$user = new App\Models\MyNamespace\Foo\Bar\User.php

もしそうなら

"psr-0": { "App\\Foo": "" }

Composer はこれらの名前空間に対処できます

/var/www/yourappdir/App/Foo
/var/www/yourappdir/App/FooBar
/var/www/yourappdir/App/Foo/Bar
/var/www/yourappdir/App/Foo/Bar/Baz

しかし、もしそうなら

"psr-0": { "App\\Foo\\": "" }

それだけで対処できるようになります

/var/www/yourappdir/App/Foo
/var/www/yourappdir/App/Foo/Bar
/var/www/yourappdir/App/Foo/Bar/Baz
于 2013-11-18T19:48:27.400 に答える