8

私はこれを何時間も試してきましたが、機能する投稿が見つからないようです. カスタム php クラスを Symfony2 ベンダー ディレクトリに追加しています。

(他のベンダー構造をコピー)

ベンダー/mylib/mylib/src/Mylib/Lib/Class.php

次に、以下を追加してルート composer.json を更新しました。

"require": {
    "mylib/mylib": "@dev"
},

また、 vendor/mylib/mylib に composer.json を作成しました。

{
    "name": "mylib/mylib",
    "type": "library",
    "description": "My Libraty",
    "keywords": ["library"],
    "autoload": {
        "psr-0": { "Mylib\\": "src/" }
    },
    "minimum-stability": "dev"
}

Class.php に名前空間を追加しました。

namespace MyLib\Lib;

私のバンドルの 1 つに、以下を追加しました。

use MyLib\Lib\ClassName as ClassName;
class Cms extends ClassName
{}

私が得ているエラーは次のとおりです。

FatalErrorException: エラー: クラス 'MyLib\Lib\MyClass' が C:\xampp\htdocs\My_CMS\src\Cms\CmsBundle\Entity\Cms.php 行 13 に見つかりません

私は何を間違っていますか?

4

4 に答える 4

10

基本的にクラスをロードする symfony の方法であるサービス コンテナーを使用する必要があります。

理由は次のとおりです。

  1. つまり、サービスは必要になるまで構築されません。
  2. コードの再利用のベスト プラクティス。
  3. アプリケーション内の各機能を分離します。
  4. 各サービスは 1 つのジョブしか実行しないため、各サービスに簡単にアクセスして、必要な場所でその機能を使用できます。
  5. 各サービスは、アプリケーション内の他の機能から分離されているため、より簡単にテストおよび構成することもできます。
  6. この考え方はサービス指向アーキテクチャと呼ばれ、Symfony や PHP に固有のものではありません。

http://symfony.com/doc/current/book/service_container.html

A Service Container (or dependency injection container) is simply a PHP object that manages the instantiation of services (i.e. objects).

したがって、基本的に symfony はコントローラーでクラスのインスタンス化を処理します。あなたがする必要があるのは次のことだけです:

Libraries という名前のパスの下にフォルダーを追加します --> src/AppBundle/Libraries

クラスをこのフォルダーに追加し、名前空間を先頭にします。私の例は次のとおりです。

    <?php

namespace AppBundle\Libraries;

class MyRecommendations{


    public function __construct(){

    }

    public function init(){
        die("init");
    }


}

次に、services.yml というファイルをアプリに追加します。app/config/services.yml

次のコードを入れて、ymlファイルでタブを使用しないでください

services:
    myrecommendations:
        class:        AppBundle\Libraries\MyRecommendations
        #arguments:    [specialparamhere]  #constructor parameters here

次に、3 行目の resources: services.yml を config.yml ファイルに追加します。

imports:
    - { resource: parameters.yml }
    - { resource: security.yml }
    - { resource: services.yml }

使用するときはコントローラーの上部に use ステートメントを追加するだけです

use AppBundle\Libraries\MyRecommendations;

コードを呼び出す

$test = $this->get('myrecommendations');
            $test->init();

エコーアウト

init
于 2015-01-04T17:44:57.180 に答える
4

PHP では、クラスは __autoload を介して自動ロードされます

Symfony はClass Loaderでそれを処理しますが、実際には同じように動作します。すべてのディレクトリをスキャンするバックグラウンドはないため、名前空間を手動で追加する必要があります。

autoload.php ファイルに追加する必要があります。

$loader->add('NAMESPACE','/path/to/vendor');
于 2013-08-25T22:43:24.077 に答える
0

The last answer is correct: https://stackoverflow.com/a/27768442/2400373

I work for me however is important add that this is correct but if you before you install the library en autoload. In my case in Symfony 3.2.x I added my library en composer.json:

"autoload": {
    "psr-4": { "": "src/" },
    "classmap": [ "app/AppKernel.php", "app/AppCache.php","**src/AppBundle/juanitourquiza/pagopayphone/library"** ]

And after this instruction:

composer update

Then all is well.

Regards

于 2017-06-16T14:47:32.677 に答える