EKG uyumluluğu: Nasıl yapılır?


10

Bir gibi bir şey yoktur coding standardiçin Magento 1 olarak adlandırılan, ECGpek çok şey kullanılmamalıdır yöntemler kaçınılması veya olması gereken yerde.

Kodunuza "hata" veya "uyarı" atan tüm durumları kapsayan bir liste oluşturmaya çalışalım.

Aşağıda tüm olası uyarıları içeren bir liste bulacaksınız. Bu yazıyı düzenli aralıklarla güncelleyeceğim ve verilen ve yükseltilmiş cevaplara bağlantı vereceğim.

Not: Lütfen yinelenen cevaplardan kaçınmaya çalışın;)

İndir: https://github.com/magento-ecg/coding-standard


EKG Koklamaları

Sınıflar

mysql4

Mysql4 sınıfları kullanılmıyor.

Nesne Örnekleme

Magento'da doğrudan nesne örneklemesi (% s sınıfı) önerilmez.

protected $disallowedClassPrefixes = array(
    'Mage_',
    'Enterprise_',
);

...

PHP

Goto

Goto kullanımı önerilmez.

...

Ad alanı

"'. $ ExceptionClassName.'" Sınıfı için ad alanı belirtilmedi.

...

Özel Sınıf Üyesi

Özel sınıf üyesi tespit edildi.

...

var

Özel sınıf üyesi tespit edildi.

...

Verim

Koleksiyon Sayısı

Magento veri toplamasının gereksiz yüklenmesi. Bunun yerine getSize () yöntemini kullanın.

fetchAll

fetchAll (), büyük veri kümeleri için bellek yetersiz olabilir.

...

GetFirstItem

getFirstItem (), toplama yükünün sonucunu bir öğe ile sınırlamaz.

döngü

Dizi boyutu hesaplama işlevi% s döngüde algılandı

Döngüde% s model LSD yöntemi algılandı

Döngüde veri yükü% s yöntemi algılandı

protected $countFunctions = array(
    'sizeof',
    'count'
);
protected $modelLsdMethods = array(
    'load',
    'save',
    'delete'
);

Güvenlik

EKL

% S sınıfında% s () ACL yöntemi eksik.

const PARENT_CLASS_NAME = 'Mage_Adminhtml_Controller_Action';
const REQUIRED_ACL_METHOD_NAME = '_isAllowed';

...

Cesareti kırılmış işlev

public $forbiddenFunctions = array(
    '^is_dir' => null,
    '^is_file$' => null,
    '^pathinfo$' => null,
);

...

Yasak İşlev

public $forbiddenFunctions = array(
    '^assert$' => null,
    '^bind_textdomain_codeset$' => null,
    '^bindtextdomain$' => null,
    '^bz.*$' => null,
    '^call_user_func$' => null,
    '^call_user_func_array$' => null,
    '^chdir$' => null,
    '^chgrp$' => null,
    '^chmod$' => null,
    '^chown$' => null,
    '^chroot$' => null,
    '^com_load_typelib$' => null,
    '^copy$' => null,
    '^create_function$' => null,
    '^curl_.*$' => null,
    '^cyrus_connect$' => null,
    '^dba_.*$' => null,
    '^dbase_.*$' => null,
    '^dbx_.*$' => null,
    '^dcgettext$' => null,
    '^dcngettext$' => null,
    '^dgettext$' => null,
    '^dio_.*$' => null,
    '^dirname$' => null,
    '^dngettext$' => null,
    '^domxml_.*$' => null,
    '^exec$' => null,
    '^fbsql_.*$' => null,
    '^fdf_add_doc_javascript$' => null,
    '^fdf_open$' => null,
    '^fopen$' => null,
    '^fsockopen$' => null,
    '^ftp_.*$' => null,
    '^fwrite$' => null,
    '^gettext$' => null,
    '^gz.*$' => null,
    '^header$' => null,
    '^highlight_file$' => null,
    '^ibase_.*$' => null,
    '^id3_set_tag$' => null,
    '^ifx_.*$' => null,
    '^image.*$' => null,
    '^imap_.*$' => null,
    '^ingres_.*$' => null,
    '^ircg_.*$' => null,
    '^ldap_.*$' => null,
    '^link$' => null,
    '^mail$' => null,
    '^mb_send_mail$' => null,
    '^mkdir$' => null,
    '^move_uploaded_file$' => null,
    '^msession_.*$' => null,
    '^msg_send$' => null,
    '^msql$' => null,
    '^msql_.*$' => null,
    '^mssql_.*$' => null,
    '^mysql_.*$' => null,
    '^odbc_.*$' => null,
    '^opendir$' => null,
    '^openlog$' => null,
    '^ora_.*$' => null,
    '^ovrimos_.*$' => null,
    '^parse_ini_file$' => null,
    '^parse_str$' => null,
    '^parse_url$' => null,
    '^parsekit_compile_string$' => null,
    '^passthru$' => null,
    '^pcntl_.*$' => null,
    '^posix_.*$' => null,
    '^pfpro_.*$' => null,
    '^pfsockopen$' => null,
    '^pg_.*$' => null,
    '^php_check_syntax$' => null,
    '^popen$' => null,
    '^print_r$' => null,
    '^printf$' => null,
    '^proc_open$' => null,
    '^putenv$' => null,
    '^readfile$' => null,
    '^readgzfile$' => null,
    '^readline$' => null,
    '^readlink$' => null,
    '^register_shutdown_function$' => null,
    '^register_tick_function$' => null,
    '^rename$' => null,
    '^rmdir$' => null,
    '^scandir$' => null,
    '^session_.*$' => null,
    '^set_include_path$' => null,
    '^set_ini$' => null,
    '^set_time_limit$' => null,
    '^setcookie$' => null,
    '^setlocale$' => null,
    '^setrawcookie$' => null,
    '^shell_exec$' => null,
    '^sleep$' => null,
    '^socket_.*$' => null,
    '^stream_.*$' => null,
    '^sybase_.*$' => null,
    '^symlink$' => null,
    '^syslog$' => null,
    '^system$' => null,
    '^touch$' => null,
    '^trigger_error$' => null,
    '^unlink$' => null,
    '^vprintf$' => null,
    '^mysqli.*$' => null,
    '^oci_connect$' => null,
    '^oci_pconnect$' => null,
    '^quotemeta$' => null,
    '^sqlite_popen$' => null,
    '^time_nanosleep$' => null,
    '^base64_decode$' => null,
    '^base_convert$' => null,
    '^basename$' => null,
    '^chr$' => null,
    '^convert_cyr_string$' => null,
    '^dba_nextkey$' => null,
    '^dns_get_record$' => null,
    '^extract$' => null,
    '^fdf_.*$' => null,
    '^fget.*$' => null,
    '^fread$' => null,
    '^fflush$' => null,
    '^get_browser$' => null,
    '^get_headers$' => null,
    '^get_meta_tags$' => null,
    '^getallheaders$' => null,
    '^getenv$' => null,
    '^getopt$' => null,
    '^headers_list$' => null,
    '^hebrev$' => null,
    '^hebrevc$' => null,
    '^highlight_string$' => null,
    '^html_entity_decode$' => null,
    '^ibase_blob_import$' => null,
    '^id3_get_tag$' => null,
    '^import_request_variables$' => null,
    '^ircg_nickname_unescape$' => null,
    '^ldap_get_values$' => null,
    '^mb_decode_mimeheader$' => null,
    '^mb_parse_str$' => null,
    '^mcrypt_decrypt$' => null,
    '^mdecrypt_generic$' => null,
    '^msg_receive$' => null,
    '^ngettext$' => null,
    '^ob_get_contents$' => null,
    '^ob_get_flush$' => null,
    '^rawurldecode$' => null,
    '^shm_get_var$' => null,
    '^stripcslashes$' => null,
    '^stripslashes$' => null,
    '^token_get_all$' => null,
    '^unpack$' => null,
    '^convert_uudecode$' => null,
    '^iconv_mime_decode$' => null,
    '^iconv_mime_decode_headers$' => null,
    '^iconv_mime_encode$' => null,
    '^iconv_set_encoding$' => null,
    '^php_strip_whitespace$' => null,
    '^addcslashes$' => null,
    '^addslashes$' => null,
    '^escapeshellarg$' => null,
    '^escapeshellcmd$' => null,
    '^gettype$' => null,
    '^var_dump$' => null,
    '^tempnam$' => null,
    '^realpath$' => null,
    '^linkinfo$' => null,
    '^lstat$' => null,
    '^stat$' => null,
    '^lchgrp$' => null,
    '^lchown$' => null,
    '^show_source$' => null,
    '^is_executable$' => null,
    '^is_link$' => null,
    '^is_readable$' => null,
    '^is_writable$' => null,
    '^is_writeable$' => null,
    '^is_uploaded_file$' => null,
    '^glob$' => null,
    '^ssh2_.*$' => null,
    '^delete$' => null,
    '^file.*$' => null,
);

Dosya Ekle

"% s" ifadesi algılandı. Dosya manipülasyonları önerilmez.

... İfade bir işlev değildir, parantez gerekmez.

... URL'leri geçmek yasaktır.

... Zincirleme yapmak yasaktır.

... İçindeki değişkenler güvensizdir.

public $urlPattern = '#(https?|ftp)://.*#i';

...

Dil Yapısı

Geri alıntı dize sabitinin yanlış kullanımı. Geri tırnak işaretleri her zaman dizgilerin içinde olmalıdır.

% S dil yapısının kullanımı önerilmez.

    return array(
        T_EXIT,
        T_ECHO,
        T_PRINT,
        T_BACKTICK
    );

...

Süper küresel

% S Superglobal'ın doğrudan kullanımı tespit edildi.

public $superGlobalErrors = array(
    '$GLOBALS',
    '$_GET',
    '$_POST',
    '$_SESSION',
    '$_REQUEST',
    '$_ENV'
);
public $superGlobalWarning = array(
    '$_FILES',
    '$_COOKIE',
    '$_SERVER',
);

sQL

Ham Sorgu

% S olası ham SQL ifadesi algılandı

public $statements = array(
    'SELECT',
    'UPDATE',
    'INSERT',
    'CREATE',
    'DELETE',
    'ALTER',
    'DROP'
);
public $queryFunctions = array(
    'query',
    'raw_query'
);

...

Yavaş Sorgu

% S olası yavaş SQL ifadesi algılandı

% S olası yavaş SQL yöntemi algılandı

public $adapterMethods = array(
    'group',
    'having',
    'distinct',
    'addLikeEscape',
    'escapeLikeValue',
    'union',
    'orHaving',
);
public $rawStatements = array(
    'GROUP BY',
    'HAVING',
    'DISTINCT',
    'LIKE',
    'UNION',
);

...

Teller

RegEx

% S içinde olası yürütülebilir düzenli ifade. Desenin "e" değiştiricisini içermediğinden emin olun

public $functions = array(
    'preg_replace',
);

...

String Concat

Tespit edilen iki dizeyi birleştirmek için + operatörünün kullanımı

...

Dize Konumu

% S fonksiyonunun dönüş değerini test etmek için aynı operatör === kullanılmıyor

public $functions = array(
    'strpos',
    'stripos',
);

En için ilgili sorular ve cevaplar


Bu yazı hakkında LOL, neredeyse bir doktor yazdın :)
PЯINCƏ

@Başka biri bunu tamamlamak için biraz yardımcı olabilir: P
sv3n

Ben öyle düşünmüyorum :)
PЯINCƏ

stripcslashes () için herhangi bir alternatif? @ sv3n böyle açıklama soru ve cevapları için teşekkürler :)
Keyur Shah

@KeyurShah Hayır. Ya uyarıyı görmezden gel ya da "önce" kaçınmaya çalışın :) Hangi durumda kullanırsınız? Belki bunu soru olarak ekleyebilirsin?
sv3n

Yanıtlar:


6

Yasak İşlev

dosya var()

File_exists () işlevinin kullanılması yasaktır

yanlış:

if (!file_exists($filePath)) {
    ...
}

doğru:

$io = new Varien_Io_File();
if (!$io->fileExists($filePath)) {
    ...
}

veya

$validatorNot = new Zend_Validate_File_NotExists($path);
if ($validatorNot->isValid($file)) {
    ...
}

5

GetFirstItem

getFirstItem (), toplama yükünün sonucunu bir öğe ile sınırlamaz.

yanlış:

$collection = Mage::getModel('catalog/category')
    ->load(41)
    ->getProductCollection()
    ->addAttributeToSelect('weight');

$product = $collection->getFirstItem();
$weight  = $product->getData('weight');

doğru:

Verileri almadan önce sınır uygula.

$collection->getSelect()->limit(1)

veya

$collection->setPageSize(1, 1)

Expamples:

750 ürünlü koleksiyon ...

Daha önce sınırlama olmadan:

  • Toplam Dahil Duvar Süresi (mikro saniye): 2.116.522 mikro saniye
  • Toplam Dahil İşlemci (microsecs): 2.101.688 microsecs
  • Toplam Dahil MemUse (bayt): 4.783.504 bayt
  • Toplam Dahil PeakMemUse (bayt): 4,363,112 bayt
  • İşlev Çağrı Sayısı: 104.187

Kullanarak getSelect()->limit(1):

  • Toplam Dahil Duvar Süresi (microsec): 149.803 microsec
  • Toplam Dahil İşlemci (microsecs): 131.405 microsecs
  • Toplam Dahil MemUse (bayt): 2.384.840 bayt
  • Toplam Dahil PeakMemUse (bayt): 1.827.112 bayt
  • İşlev Çağrı Sayısı: 5.327

Kullanarak setPageSize(1, 1)

  • Toplam Dahil Duvar Süresi (mikrosaniye): 155,025 mikrosaniye
  • Toplam Dahil İşlemci (microsecs): 136,191 microsecs
  • Toplam Dahil MemUse (bayt): 2.413.128 bayt
  • Toplam Dahil PeakMemUse (bayt): 1.856.064 bayt
  • İşlev Çağrı Sayısı: 5.515

Not:

Koleksiyonunuzu daha önce sınırlasanız bile bu uyarı yine de açılır. Bu mesajdan kurtulmak için $collection->getLastItem()kullanın.


Data access method LIMIT detected outside of Resource ModelLimiti kullanırken alıyorum ``
Amit Patel

1
İşte daha fazla detay
Amit Patel

5

Yasak İşlev

curl_xyz

Curl_init (), curl_setopt (), curl_exec (), curl_close () işlevinin kullanılması yasaktır

yanlış:

$ch = curl_init();
curl_setopt($connection, CURLOPT_HTTPHEADER, $header);
curl_setopt($connection, CURLOPT_POSTFIELDS, $request);
curl_setopt($connection, CURLOPT_URL, $url);
$response = curl_exec($ch);
curl_close($ch);

doğru:

$options = array(
    CURLOPT_HTTPHEADER => $header,
    CURLOPT_POSTFIELDS => $request
);

$curl = new Varien_Http_Adapter_Curl();
$curl->setOptions($options);
$curl->write(Zend_Http_Client::GET, $url, Zend_Http_Client::HTTP_0);
$response = $curl->read();
$responseBody = Zend_Http_Response::extractBody($response);
$curl->close();

Yukarıdaki kodu kullandım ve bana hata veriyor Uncaught Error: Class 'Custom\Rma\Helper\Varien_Http_Adapter_Curl' not found. Sınıfı kullanmak nasıl satıcı ama hayır şans bulundu.
Nitin Pawar

@NitinPawar lütfen yeni bir soru açabilir misiniz? Kodunuzla ilgili bir sorun var gibi görünüyor.
sv3n
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.