Magento Marketplaceテクニカルレビューレポートで発生した警告/エラーの修正方法


25

新しいMagentoマーケットプレイスでは、提出された拡張機能がいくつかの検証状態を経て、マーケットプレイスで承認および利用可能になります。

そのうちの1つはテクニカルレビューで、そこから次のようなテクニカルレポートを取得できます。

マーケットプレイステクニカルレポート

ご覧のとおり、200以上の警告が私を驚かせています。ドキュメントで利用可能なリスト以外のすべての警告を修正するのに役立つリソースはあります:http : //docs.magento.com/marketplace/user_guide/extensions/ review-code-validation.html


PHP CodeSnifferと、Magento 2が使用している標準が何であれ、ここで誰かがPSR-2を提案すべきだと思います。きっと!?
ロビーアヴェリル

PSR-1とPSR-2の両方を使用します。
マニッシュ

@raphael、pls see this、magento.stackexchange.com
questions/192506/

@raphael plsは、これを参照してください。magento.stackexchange.com/questions/71399/...
アビシェーク

回答:


31

レポートを1時間読んだ後、私は次のリストを思いつきました。

さらに警告/エラーが見つかったらすぐに更新するようにします:

警告

行が80文字を超えています。X文字を含む

または

行が100文字の上限を超えています。X文字を含む

それらは私が最もよく見たもので、自明です。きれいで読みやすいコードを維持するために、コーディング行を小さくすることは良い習慣です。

関数呼び出しのコンマの後にスペースが見つかりません

パラメーターを受け取る関数を呼び出しましたが、コンマの後にスペースを追加しませんでした。例:あるstrrchr($bla,".")べきstrrchr($bla, ".")

期待される\ "while(...){\ n \"; 見つかった\ "while(...)\ n {\ n \"

期待される\ "foreach(...){\ n \"; \ "foreach(...)\ n {\ n \"が見つかりました

期待される\ "if(...){\ n \"; \ "if(...)\ n {\ n \"が見つかりました

\ "} else {\ n \";が必要です。\ "} \ nその他{\ n \"が見つかりました

つまり、これらのPHPステートメントの開き括弧の前に行が返されたことを意味します。

if / elseステートメントを使用した不適切な構文の例:

if (true)
{
}
else
{
}

あるべき

if (true) {
} else {
}

複数行関数宣言の右括弧と左括弧は同じ行になければなりません

ほとんどの場合、次のようなものを宣言するコンストラクターで発生します。

public function __construct(
    ProductFactory $productFactory,
    Test $test
)
{
}

一方、次のようになります。

public function __construct(
    ProductFactory $productFactory,
    Test $test
) {
}

行末文字は無効です。\ "\ n \"が必要ですが、\ "\ r \ n \"が見つかりました

ほとんどの場合、ファイルの先頭で起こります。これは、IDEがリターン文字をエンコードする方法が原因です。

変数\ "your_variable \"は有効なキャメルキャップ形式ではありません

すべての変数は、ラクダキャップの形式を使用する必要があり、そう$your_variableでなければなりません$yourVariable

変数\ "one2Three \"には数字が含まれていますが、これは推奨されません

変数で数値を使用しないでください

インライン制御構造は許可されていません

次のようなインライン制御構造を使用しないでください。

else $test = true;

以下を使用する必要があります。

else {
    $test = true;
}

クラスの左中括弧は、定義の後の行になければなりません

クラスを宣言するときに行を返しました:

class Test
{

開始ブレースを同じ行に置く必要があります。

class Test {

プライベートメンバー変数\ "yourVariable \"には先頭にアンダースコアが含まれている必要があります

保護されたメンバー変数\ "yourVariable \"には先頭にアンダースコアが含まれている必要があります

保護されたメンバー変数とプライベートメンバー変数に先頭の下線を追加する必要があります。 $_yourVariable

これら2つの反対として、パブリック変数にアンダースコアを追加すると、次のようになります:

パブリックメンバー変数\ "_ yourVariable \"には、先頭にアンダースコアを含めることはできません。

メソッドパラメータ$ blaは使用されません

メソッドにパラメーターを渡しましたが、使用することはありません。

複数行の関数宣言が正しくインデントされていません。8スペースが必要ですが、Xが見つかりました

関数宣言パラメーターに追加したインデントが多すぎます:

public function __construct(ProductRepository $productRepository,
                            ListsInterface $listsInterface,
                            Data $helper
) {

する必要があります:

public function __construct(ProductRepository $productRepository,
    ListsInterface $listsInterface,
    Data $helper
) {

無効なメソッドのオーバーライドの可能性が検出されました

変更を追加せずにメソッドをオーバーライドしています、例:

public function __construct(Context $context) {
    parent::__construct($context);
}

ループで検出されたモデルLSDメソッドload()

load()ループ内でメソッドを使用していますが、これは推奨されておらず、回避する必要があります。

ほとんどの場合、コードは次のようになります。

foreach(...) {
    $model->load();
}

ループでモデルをロードしている場合、パフォーマンスの点でかなり悪いです。いくつかの属性のみを取得する必要がある場合は、代わりにコレクションを使用する必要があります。

関数の循環的複雑度(X)は10を超えています。関数のリファクタリングを検討する

循環的な複雑さに慣れていない場合は、この投稿(https://pdepend.org/documentation/software-metrics/cyclomatic-complexity.html)を読むことをお勧めします。この警告は基本的に、関数内のループと条件が多すぎることを意味します。

Magento 2では、オブジェクトの直接インスタンス化は推奨されません

これは、たとえば次のように、クラスを呼び出すことでオブジェクトを直接インスタンス化しているという事実が原因です。

new \Zend_Filter_LocalizedToNormalized

依存性注入または最後の手段であるオブジェクトマネージャーを使用する必要があります。

コメントはTODOタスクを参照します

コメントの1つに次の@TODOフラグが含まれています。

常に真または偽のIFステートメントを避ける

常に真または偽と思われる条件を作成しました。

例えば:

$variable = "6";
...
// More code that doesn't change $variable
...
if ($variable)

エラー

\ "Class \"クラスの名前空間が指定されていません。

use Path\To\Class;クラスの冒頭に文がありません。


1
これを適切に理解した場合、これらの推奨事項はすべてのM2拡張機能に言及しています(個人的な使用であっても)?
Siarhey Uchukhlebau

@SiarheyUchukhlebauはい、それはあなたがMagentoのマーケットプレースで拡張アップロードしたら、あなたが得る技術報告書だ
デジタルPianismでラファエルを

1
You should keep the opening brace on the same line:それは逆ではないですか?ちなみに素晴らしい投稿
Claudiu Creanga

@ClaudiuCreanga私はあなたが正しいと思いますダブルチェックしてください;)
デジタルピアニズムのラファエル

10k以上の警告メッセージを持つ拡張機能をプッシュすることは可能ですか?または、警告があるすべてを拒否しますか?
ローランドSoós16年

9

(Magentoのバージョンに応じて)MEQP1またはMEQP2ルールセットでCodesnifferを使用すると、Magentoルールセットについてのアイデアが得られます:https : //github.com/magento/marketplace-eqp/tree/master/

このルールセットとMarketplaceの送信プロセスで実行されているルールセットは、必ずしも完全に同期しているわけではありません(もちろん、それが理想的です)。

一般的な「重大度-10」エラー(拡張機能が拒否される唯一のエラー)とその推奨事項には、次のものがあります。

終了タグは、PHPファイルの末尾では許可されていません

推奨事項:PHPの終了タグを削除してください。

呼び出し時の参照渡し呼び出しは禁止されています

推奨事項:PHP 5のリファレンスに関するドキュメントを読み、コードをリファクタリングしてください。参照:http : //php.net/manual/en/language.references.pass.php

$ _ENV Superglobalの直接使用が検出されました。

スーパーグローバル$ _GETの直接使用が検出されました。

スーパーグローバル$ _POSTの直接使用が検出されました。

スーパーグローバル$ _REQUESTの直接使用が検出されました。

$ _SESSION Superglobalの直接使用が検出されました。

$ GLOBALS Superglobalの直接使用が検出されました。

推奨事項:Cookie、セッション、またはリクエストデータを取得するには、対応するラッパーオブジェクトを使用します。

関数set_magic_quotes_runtime()は廃止されました

推奨事項:非推奨の関数は、将来のバージョンからいつでも削除される可能性があるため、使用しないでください。[おそらくすべての非推奨の一般的なエラー]

同一の演算子===はstrpos関数の戻り値のテストには使用されません

stripos関数の戻り値のテストには、同一の演算子===は使用されません

推奨事項:この関数の戻り値をテストするには、===演算子を使用します。

バッククォート文字列定数の誤った使用法。バッククォートは常に文字列の中にあるべきです。

推奨事項:[個別の推奨事項はありません。これはバッククォートでexecを防ぐためだと思います。]

[ClassName]クラスに_isAllowed()ACLメソッドがありません。

推奨事項:特権の設定、管理、および取り扱いを非常に慎重に管理してください。ACLリソースは各adminhtmlコントローラーのadminhtml.xmlファイルで定義し、_isAllowed()メソッドを実装する必要があります。

[ExceptionClassName]クラスの名前空間が指定されていません。

推奨事項:例外名前空間を指定してください。

PHP構文エラー:呼び出し時の参照渡しが削除されました

推奨事項:構文エラーを修正してください。[これは上記に付属しています。他のすべてのPHP構文エラーについても同様の一般的なエラーが表示されると思います]

Magento 2デザイン違反の可能性。典型的なMagento 1構造を検出しました。

推奨事項:[これには推奨事項はありませんが、Mage :: blahやMage_blah_blah :: blahなどのクラスの使用が検出されるコードについて説明します。これらは、Magento 1にのみ存在し、Magento 2では機能しないクラスです。 M2拡張機能で正規表現Mage(\b|_)を検索して、M1の使用状況を事前に確認してください。]

リソースはPHP 7の予約語です。

推奨事項:[個別の推奨事項はありません。単語の名前を別の名前に変更するだけで機能します。このエラーはすべての予約語に存在すると思います。]

PHPの開始タグは、ファイルの最初のコンテンツでなければなりません

推奨事項:PHPオープニングタグの前にあるすべての文字を削除してください。

言語構造の使用は推奨されません。

出口言語構成の使用は推奨されません。

推奨事項:setBody()応答オブジェクトメソッドを使用する必要があります。

エコー言語コンストラクトの使用は推奨されません。

印刷言語コンストラクトの使用は推奨されていません。

推奨事項:クラスでのエコー、ヘッダーなどの使用を避けるために、拡張機能のアーキテクチャを変更する必要があります。応答オブジェクトのsetBody()メソッドの使用を検討してください。

eval()の使用は推奨されていません

推奨事項:eval()の使用は避けてください。


拡張機能が拒否される原因となるこれらのエラーとは異なり、拡張機能のコードを改善するために、警告は現在のところ単に礼儀としてリストされています。警告のために技術レビューから拒否されることはありませんが、多くの警告があります。

もちろん、このルールは将来強化される可能性があり、codesnifferルールセットは絶えずレビューされているため、解決できる警告の数を確認することは常に良い計画です。警告は、コードベースのシステムの問題を示す場合もあります。


テクニカルレビューからの拒否のいくつかの理由は、現在オンラインレポートには表示されず、メールでのみ提供されています。

コピーアンドペースト違反やマルウェアの検出などの場合、受信したメールにメッセージが表示されるだけで、拡張機能が受け入れられなかったことを知らせるため、メールを注意深く読んでください

これらの電子メールのアーカイブは現在、開発者ポータルからは表示されないため、読んでいないまま削除したり、ジャンクにファイルしたりすると、それらは消えてしまいます。

Magentoのレベル1レビュアーは、「この配列キー「サーバー」はおそらく「サーバー」でなければならない」など、知りたいと思われる有益な情報、または拒否と提案の理由のいずれかで、このメールに追加情報を入れることがあります「Magentoコアファイル全体をコピーしてクラスパスを変更しただけで、代わりにクラスプリファレンス設定に置き換えることができます。」または「Magentoコアファイル全体をコピーして、パブリック関数:この代わりにプラグインを使用できます。」

これらを読んでおらず、codesnifferレポートだけを見ると、間違った問題を修正しようとしている可能性があります。


またはコメントunescaped output detectedを使用してメッセージを回避しないでください。これは、Magentoの将来のバージョンでは禁止される可能性があります。代わりに、次のいずれかを使用します。@escapeNotVerified@noEscape

  • 単一引用符で囲まれた静的文字列。
  • インライン変数のない、二重引用符で囲まれた静的な文字列。
  • [推奨]値からエスケープのいずれかの方法でエスケープ \Magento\Framework\View\Element\AbstractBlockescapeHtml()escapeUrl()escapeQuote()escapeXssInUrl())。
  • 数値型にキャストされる値(少なくともboolとint、おそらく他の人?)
  • 名前に「html」という単語が含まれるメソッド呼び出しprintBannerHtml()。これを乱用しないでください!blahHtml()メソッドが実際にすべての変数を正しくエスケープすることを確認してください。

私の拡張機能は警告を表示しますが、上記のどれでもないので、警告のために私の拡張機能が拒否される可能性はありますか?
サンジェイゴヒル

私はしばらく前にこれを投稿しました-それ以来新しいものが追加されるかもしれません。開発者アカウントにログインし、拡張機能をクリックして、エラーログ、表示されているメッセージ、エラーのレベルを確認します。重大度が10でない場合、他の何らかの理由で拒否される場合があります。拒否メールには何と書かれていますか?
デウィモーガン

6

エラー:

エスケープされていない出力が検出されました

.phtmlファイルのエラー

<ul class="form-list" id="payment_form_<?php echo $code ?>" style="display:none;">

あなたは使用を叫ぶ:

<ul class="form-list" id="payment_form_<?php /* @noEscape */ echo $code ?>" style="display:none;">

http://devdocs.magento.com/guides/v2.0/frontend-dev-guide/templates/template-security.html#escape-functions-for-templatesのテンプレートXSSセキュリティを参照してください。


これは非常に貧弱なプログラミングスタイルです。このようにコマンド@noEscape@escapeNotValidatedコマンドを乱用しないでください。使用すると、これらは非推奨になり、MEQPシステムで許可されなくなる可能性があります。データをエスケープするためのさまざまな優れた方法については、私の回答の最後をご覧ください。
デウィモーガン

1
@Dewi Morgan:貴重な情報をありがとう。
-Sankar_k
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.