मैं एक test.php स्क्रिप्ट में Magento 2 कैसे बूट कर सकता हूं?


93

Magento 1 में मैं एक फ़ाइल बना सकता हूँ जहाँ मुझे केवल Mage_Core_Model_Appकक्षा को तुरंत करने की आवश्यकता थी और फिर मैं परीक्षण प्रयोजनों के लिए अपना "गंदा" कोड जोड़ सकता था।
कुछ इस तरह test.php:

<?php
//some settings
error_reporting(E_ALL | E_STRICT); 
define('MAGENTO_ROOT', getcwd()); 
$mageFilename = MAGENTO_ROOT . '/app/Mage.php'; 
require_once $mageFilename; 
Mage::setIsDeveloperMode(true); 
ini_set('display_errors', 1); 
umask(0);
//instantiate the app model
Mage::app(); 
//my toy code in here.

तब मैं test.phpब्राउज़र में कॉल करने में सक्षम था और देखता हूं कि मैं क्या कर रहा हूं।

मैं Magento 2 के लिए समान कैसे कर सकता हूं?


4
Magento 2 क्रोन कैसे काम करता है? क्या आप उसी दृष्टिकोण का उपयोग कर सकते हैं?
राजवंशी

4
अच्छा विचार है, लेकिन ... कोड से cron.php: $app = $bootstrap->createApplication('Magento\Framework\App\Cron', ['parameters' => ['group::']]);। क्या मुझे अपना ऐप मॉडल बनाना चाहिए?
मेरियस

1
एक इकाई परीक्षण लिखें
फोमन

2
@Fooman। इसे उत्तर के रूप में लिखने के लिए स्वतंत्र महसूस करें, लेकिन कृपया एक उदाहरण प्रदान करें। मैं इकाई परीक्षण के लिए नया हूँ।
मेरियस

जवाबों:


86

@ फ्लाइंगमैन के जवाब के आधार पर मैंने थोड़ी खुदाई की और समाधान निकाला। यह मेरे लिए काम करता है।
पहले मेरा समाधान, फिर कुछ स्पष्टीकरण।
मैंने test.phpअपने Magento उदाहरण की जड़ में एक फ़ाइल बनाई है ।

<?php
require __DIR__ . '/app/bootstrap.php';
$bootstrap = \Magento\Framework\App\Bootstrap::create(BP, $_SERVER);
/** @var \Magento\Framework\App\Http $app */
$app = $bootstrap->createApplication('TestApp');
$bootstrap->run($app);

फिर मैंने TestApp.phpइस सामग्री के साथ उसी स्थान पर एक फ़ाइल बनाई ।

<?php
class TestApp
    extends \Magento\Framework\App\Http
    implements \Magento\Framework\AppInterface {
    public function launch()
    {
        //dirty code goes here. 
        //the example below just prints a class name
        echo get_class($this->_objectManager->create('\Magento\Catalog\Model\Category'));
        //the method must end with this line
        return $this->_response;
    }

    public function catchException(\Magento\Framework\App\Bootstrap $bootstrap, \Exception $exception)
    {
        return false;
    }

}

अब मैं बस test.phpब्राउज़र में कॉल कर सकता हूं और वह सब कुछ जो TestApp :: लॉन्च () में रखा गया है, निष्पादित किया जाएगा।

अब, यह क्यों काम करता है: बूटस्ट्रैप क्लास
की विधि createApplicationसबसे महत्वपूर्ण हिस्सा है। यह एक अनुप्रयोग वर्ग का एक उदाहरण बनाता है। विधि 2 के तरीकों createApplicationको लागू करने की उम्मीद करती \Magento\Framework\AppInterfaceहै।
इसलिए मैंने TestAppउस इंटरफ़ेस को लागू करने में अपनी कक्षा बनाई । मैंने हमेशा विधि को catchExceptionवापस कर दिया falseक्योंकि मैं नहीं चाहता कि मेरा ऐप अपवादों को संभाल सके। अगर कुछ गलत है, तो उसे स्क्रीन पर प्रिंट करें।
फिर मैंने विधि लागू की launch। यह एक कहा जाता है \Magento\Framework\App\Bootstrap::run। यह runविधि लगभग एक ही बात करती है चाहे कोई भी पैरामीटर के रूप में आवेदन किया गया हो।
केवल एक चीज जो आवेदन पर निर्भर करती है वह है यह पंक्ति:

$response = $application->launch();

इसका मतलब यह है कि कॉलिंग \Magento\Framework\App\Bootstrap::runमेग्नेटो इनवेट (शायद कुछ अन्य पागल सामान करते हैं ... मैंने अभी तक सब कुछ नहीं जांचा है) फिर launchआवेदन से विधि को कॉल करता है ।
इसलिए आपको अपना सारा गंदा कोड उस विधि के अंदर डालना होगा।
फिर \Magento\Framework\App\Bootstrap::runकॉल $response->sendResponse();जहां $responseक्या है launchविधि रिटर्न।
इसलिए return $this->_response;जरूरत है। यह सिर्फ एक खाली प्रतिक्रिया देता है।

मैंने अपना ऐप क्लास विस्तार किया \Magento\Framework\App\Httpइसलिए मेरे पास पहले से ही अनुरोध और प्रतिक्रिया पैरामीटर (और अन्य) होंगे, लेकिन आप अपनी कक्षा को कुछ भी नहीं बढ़ा सकते हैं। फिर आपको \Magento\Framework\App\Httpक्लास से कंस्ट्रक्टर को कॉपी करना होगा । यदि आपको इसकी आवश्यकता है तो हो सकता है कि कंस्ट्रक्टर में अधिक पैरामीटर जोड़ें।


2
बेशक TestAppवर्ग ही में परिभाषित किया जा सकता था test.phpफ़ाइल, लेकिन मैं इसे उस गंदे :) बनाने के लिए नहीं करना चाहते हैं
मेरियस

मुझे विधि parent::launch();की पहली पंक्ति के रूप में जोड़ना पड़ा launch()क्योंकि यह मुझे "एरिया कोड सेट नहीं" त्रुटि दे रहा था
OSDave

@OSdave। जब मैंने परीक्षण किया तो इसके बिना काम किया। नवीनतम संस्करणों में शायद कुछ बदल गया है।
मेरियस

@ मार्स, मैंने सर्वर की क्विक इनस्टॉल को छिपाकर मैगनेटो स्थापित किया था। और ऐप में bootstrap.php नहीं है
er.irfankhan11

1
@ बटरफ्लाई आपको इसे अपने कस्टम नियंत्रक में शामिल करने की आवश्यकता नहीं है। फ़ाइल आपके नियंत्रक तक पहुँचने से पहले index.php में शामिल हो जाती है।
Marius

54

त्वरित / लघु / गंदे परीक्षणों के लिए, मैंने कुछ इस तरह का उपयोग किया:

use Magento\Framework\App\Bootstrap;
require __DIR__ . '/../app/bootstrap.php';

$bootstrap = Bootstrap::create(BP, $_SERVER);

$obj = $bootstrap->getObjectManager();

$state = $obj->get('Magento\Framework\App\State');
$state->setAreaCode('frontend');

$quote = $obj->get('Magento\Checkout\Model\Session')->getQuote()->load(1);
print_r($quote->getOrigData());

4
यह काम। अन्य जवाब नहीं है।
अहानजकद

1
यह मेरी तरफ HTTP 500 को ट्रिगर करता है।
अधिकतम

अभी भी 2.1.2 में काम करता है। मुझे आवश्यकता-पथ tho
simonthesorcerer

मेरे लिए काम नहीं किया
सरफराज सिपाई

20

@ मारियस के जवाब के आधार पर मैं इस पर आया।

यह कमांड लाइन और ब्राउज़र दोनों के माध्यम से काम करता है, जो मुझे उपयोगी लगता है।

यहां प्रोग्राम को श्रेणी से हटाने के लिए एक नमूना स्क्रिप्ट है।

scripts/abstract.php

<?php
use \Magento\Framework\AppInterface as AppInterface;
use \Magento\Framework\App\Http as Http;

use Magento\Framework\ObjectManager\ConfigLoaderInterface;
use Magento\Framework\App\Request\Http as RequestHttp;
use Magento\Framework\App\Response\Http as ResponseHttp;
use Magento\Framework\Event;
use Magento\Framework\Filesystem;
use Magento\Framework\App\AreaList as AreaList;
use Magento\Framework\App\State as State;

abstract class AbstractApp implements AppInterface
{
    public function __construct(
        \Magento\Framework\ObjectManagerInterface $objectManager,
        Event\Manager $eventManager,
        AreaList $areaList,
        RequestHttp $request,
        ResponseHttp $response,
        ConfigLoaderInterface $configLoader,
        State $state,
        Filesystem $filesystem,
        \Magento\Framework\Registry $registry
    ) {
        $this->_objectManager = $objectManager;
        $this->_eventManager = $eventManager;
        $this->_areaList = $areaList;
        $this->_request = $request;
        $this->_response = $response;
        $this->_configLoader = $configLoader;
        $this->_state = $state;
        $this->_filesystem = $filesystem;
        $this->registry = $registry;
    }

    public function launch()
    {
        $this->run();
        return $this->_response;
    }

    abstract public function run();

    public function catchException(\Magento\Framework\App\Bootstrap $bootstrap, \Exception $exception)
    {
        return false;
    }
}

scripts/delete-category.php

<?php
require dirname(__FILE__) . '/../app/bootstrap.php';
$bootstrap = \Magento\Framework\App\Bootstrap::create(BP, $_SERVER);
require dirname(__FILE__) . '/abstract.php';

class CreateCategoriesApp extends AbstractApp
{

    public function run()
    {
        $this->_objectManager->get('Magento\Framework\Registry')
            ->register('isSecureArea', true);

        $category = $this->_objectManager->create('\Magento\Catalog\Model\Category');
        $category = $category->load(343);

        $category->delete();
    }
}

/** @var \Magento\Framework\App\Http $app */
$app = $bootstrap->createApplication('CreateCategoriesApp');
$bootstrap->run($app);

फिर मैं इसे वैसे ही चलाता हूं php scripts/delete-category.php


2
फ्रंटएंड के लिए ठीक काम कर रहा है, अगर मैं एडमिन कोड एक्सेस करना चाहता हूं तो यह एरर एक्सेस या एरिया इशू दिखाता है, क्या आप बता सकते हैं कि एडमिन एरिया में कॉल कैसे करें
प्रदीप कुमार

जब कुछ बुलाने की कोशिश की जाती है, तो मुझे Magento\Framework\Exception\LocalizedException: Area code is not set:। मैं इसे कैसे सेट कर सकता हूं? मुझे फ्रेंडेंड चाहिए।
अधिकतम

मैंने एम 2 पर ज्यादा गौर नहीं किया है क्योंकि मैंने यह कोड लिखा है मुझे डर है, फ्रेमवर्क में बदलाव ने इसे अमान्य कर दिया है या इसमें संशोधन की आवश्यकता हो सकती है, क्षमा करें!
ल्यूक रॉजर्स

18

जैसा कि आप एक परीक्षण कैसे लिख सकते हैं (इसे अपने फ़ोल्डर एक्सटेंशन संरचना में रखे बिना) का एक बहुत ही छोटा उदाहरण दिया। काश यह सब कमांड लाइन है और एक ब्राउज़र के माध्यम से खपत के लिए नहीं।

फ़ाइल बनाएँ

dev/tests/unit/quicktest.php

साथ में

<?php

class QuickTest extends \PHPUnit_Framework_TestCase
{
    public function testExample()
    {
        //instantiate your class
        $context = new Magento\Framework\Object();

        $context->setData('param', 'value');

        //test whatever you want to test
        $this->assertEquals('value', $context->getData('param'));

        //you could even output to console
        echo $context->getData('param');

    }
}

फिर डायरेक्टरी dev/tests/unit/रन से phpunit quicktest.phpजो आपके कोड को निष्पादित करेगा। यह सब काम करता है क्योंकि फ़ाइल dev/tests/unit/phpunit.xml.distस्वचालित रूप से भरी हुई है और पर्यावरण तैयार करती है।

बहुत सारे मामलों में आपको कक्षाओं के निर्माता को इनपुट की आपूर्ति करनी पड़ सकती है। कृपया dev/tests/unit/testsuite/आगे के उदाहरणों के तहत मौजूदा परीक्षणों को देखें कि यह कैसे दिख सकता है, जिसमें नकली चीजें शामिल हैं।


1
मैंने "गंदे" खेल के मैदान के लिए कहा। आपने यहाँ एक साफ दिया :)। दिलचस्प विचार। मुझे इसे एक मौका और देना होगा।
मेरियस

7
मुझे लगता है कि जिस समय मैंने एक परीक्षा का निर्माण किया था। अतीत में प्रयास के साथ-साथ एक परीक्षण लिखने में चला गया होगा जिसका एक निरंतर लाभ होगा।
पर फोमन

15

यहां परीक्षण प्रणाली में हुक करने से बेहतर तरीका है: Magento 2 के कमांड-लाइन इंटरफ़ेस का उपयोग करें।

इसका मतलब है कि आपको अपने सैंडबॉक्स कोड को एक वास्तविक मॉड्यूल में एकीकृत करना होगा (या उद्देश्य के लिए एक बनाएं), लेकिन आपको वैसे भी ऐसा करना चाहिए।

एक बार जब आप अपने मॉड्यूल है की स्थापना की , एक कमांड जोड़ने बहुत आसान है। आप सभी की जरूरत वर्ग, और यह रजिस्टर करने के लिए DI है।

7. "मॉड्यूल} /etc/di.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <type name="Magento\Framework\Console\CommandList">
        <arguments>
            <argument name="commands" xsi:type="array">
                <item name="greeting_command" xsi:type="object">Magento\CommandExample\Console\Command\GreetingCommand</item>
            </argument>
        </arguments>
    </type>
</config>

* 11. मॉड्यूल} /Console/Command/GreetingCommand.php

<?php

namespace Magento\CommandExample\Console\Command;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

/**
 * Class GreetingCommand
 */
class GreetingCommand extends Command
{
    /**
     * {@inheritdoc}
     */
    protected function configure()
    {
        $this->setName('example:greeting')
             ->setDescription('Greeting command');

        parent::configure();
    }

    /**
     * {@inheritdoc}
     */
    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $output->writeln('<info>Hello world!</info>');
    }
}

Https://github.com/magento/magento2-samples/tree/master/sample-module-command से प्राप्त उदाहरण - इस कार्यक्षमता को शामिल करने वाले एक पूर्ण मॉड्यूल के लिए देखें। इसमें कम तुच्छ उदाहरण शामिल हैं।

अधिवेशन से, आपका कमांड क्लास हमेशा साथ होना चाहिए {module}/Console/Commandऔर समाप्त होना चाहिए Command.php

एक बार जब आप कोड (और प्लावित Magento कैश, आदि) के उन दो टुकड़े जोड़ दिया है, SSH में नाम से अपने आदेश निष्पादित करें: php bin/magento example:greeting

आप इस संदर्भ में निर्भरता इंजेक्शन का उपयोग कर सकते हैं, ताकि आप अपने भीतर किसी भी कोड को चला सकें execute()

यह इंटरफ़ेस सिम्फनी के कंसोल घटक पर बनाया गया है , इसलिए आपके पास कार्यक्षमता, तर्क , तालिकाओं और बहुत आसान प्रगति बार सहित कार्यक्षमता की उस विस्तृत श्रृंखला तक सभी की पूर्ण पहुंच है ।

यदि आप अपना कमांड या विकल्प सेट करने में किसी भी समस्या में भाग लेते हैं, तो आप आमतौर पर 'सूची' कमांड चला सकते हैं कि क्या गलत हो रहा है में बेहतर दृश्यता प्राप्त करने के लिए: php bin/magento list

का आनंद लें।


अच्छा! बड़े निर्यात वाली लिपियों के लिए सिम्फनी की प्रगति सलाखों के साथ। धन्यवाद
urbansurfers

13

महत्वपूर्ण हिस्सा है \Magento\Framework\App\Bootstrap::create

लेकिन जैसा कि Bootstrap::init()विधि निजी है, और इसमें कई महत्वपूर्ण चीजें होती हैं, सार्वजनिक तरीकों से इसे कॉल करने की आवश्यकता होती है।

एक तरफ थॉट्स createApplication()और run()विधि का पालन , लेकिन यह भी विधि getDirList()और getObjectManager()विधि, जो दोनों को किसी भी तर्क की आवश्यकता नहीं है।

तो एक आवेदन की जरूरत नहीं है, downsides हैं, कि त्रुटि हैंडलर आरंभीकृत नहीं है।


6

संभवतः ऑफ-टॉपिक, लेकिन मैं हमेशा चीजों (IndexAction पद्धति) का परीक्षण करने के लिए Magento 1 में संपर्क सूचकांक नियंत्रक फ़ाइल का उपयोग करता हूं। यह example.com/contacts पर जाना जितना आसान है। आपको केवल यह सुनिश्चित करना है कि उन परिवर्तनों को न करें;)

मुझे यकीन है कि आप Magento 2 में कुछ ऐसा ही कर सकते हैं। बूटस्ट्रैप कोड के साथ एक नई फ़ाइल बनाने के लिए आपको खर्च करता है।


1
स्वर्ग आपको मना करता है, या उत्पादन पर करता है! कृपया कोर कोड को संशोधित न करें।
रयान होर

@RyanH। नहीं होगा। संस्करण नियंत्रण, स्वचालित बिल्ड, स्टेटिक कोड विश्लेषण, सहकर्मी कोड समीक्षा, स्टेजिंग / उपयोगकर्ता स्वीकृति परीक्षण / आदि। लेकिन हाँ, अगर आपके पास ऐसा नहीं है, तो यह एक मौका है कि यह उत्पादन पर समाप्त हो सकता है: P
Erfan

1
यह आपके लिए बहुत अच्छा है, लेकिन यहाँ देखने वाले अधिकांश लोगों के पास उन प्रकार के नियंत्रण नहीं होंगे। चीजों को करने का सही तरीका सिखाना (और करना) हमेशा बेहतर होता है।
रयान होरे

5

यह उत्तर Marius द्वारा दिए गए उत्तर के लिए एक मामूली संशोधन है

क्योंकि Magento 2.1 में Area code not setउस कोड का उपयोग करते समय त्रुटि मिली ।So the intension of this answer is to fix that error on Magento 2.1

इस त्रुटि को ठीक करने के लिए आपको क्या करना है, यह आपके क्षेत्र में परिभाषित किया गया है test.php file। (नीचे संशोधित फ़ाइल देखें)।

<?php
require __DIR__ . '/app/bootstrap.php';
$bootstrap = \Magento\Framework\App\Bootstrap::create(BP, $_SERVER);
$obj = $bootstrap->getObjectManager();

$state = $obj->get('Magento\Framework\App\State');
$state->setAreaCode('frontend');
/** @var \Magento\Framework\App\Http $app */
$app = $bootstrap->createApplication('TestApp');
$bootstrap->run($app);

और TestApp.phpफाइल वही रहेगी।

<?php

class TestApp
    extends \Magento\Framework\App\Http
    implements \Magento\Framework\AppInterface {
    public function launch()
    {
        //dirty code goes here.
        $objectManager = \Magento\Framework\App\ObjectManager::getInstance();
        $product = $objectManager->get('Magento\Catalog\Model\Product')->load(71);
        var_dump($product->getData());

        return $this->_response;
    }

    public function catchException(\Magento\Framework\App\Bootstrap $bootstrap, \Exception $exception)
    {
        return false;
    }

}

यह भी 2.1.6 में मेरे लिए काम नहीं करता है, मुझे मिलता हैUncaught TypeError: Argument 2 passed to Magento\\Framework\\App\\Http::__construct() must be an instance of Magento\\Framework\\Event\\Manager, none given
गुरिल्ला

5

आप नीचे दिए गए कोड को जोड़ने के साथ Magento रूट पर स्क्रिप्ट को निर्देशित कर सकते हैं और बूटस्ट्रैप को शामिल किया जाएगा .. [Magento रूट फ़ोल्डर पर test.php बनाएं और नीचे दिए गए कोड को शामिल करें]

ini_set('display_errors', 1);
ini_set('max_execution_time', 0);
ini_set("memory_limit", "-1");
set_time_limit(0);
error_reporting(E_ALL);
require './app/bootstrap.php';
$bootstrap = \Magento\Framework\App\Bootstrap::create(BP, $_SERVER);
$objectManager = $bootstrap->getObjectManager();
$state = $objectManager->get('Magento\Framework\App\State');
$state->setAreaCode('admin');

आशा है कि यह मददगार होगा।


2

आप नीचे दिए गए कोड का उपयोग करके Magento 2 रूट से डायरेक्ट स्क्रिप्ट चला सकते हैं। Magento 2 रूट डायरेक्टरी में एक नई फाइल बनाएं और इस कोड को जोड़ें और इसके बाद फाइल में अपनी स्क्रिप्ट जोड़ें।

<?php
    use Magento\Framework\App\Bootstrap;
    include('app/bootstrap.php');
    $bootstrap = Bootstrap::create(BP, $_SERVER);

    $objectManager = $bootstrap->getObjectManager();

    $state = $objectManager->get('Magento\Framework\App\State');
    $state->setAreaCode('frontend');

1

यहाँ मैं Magento निर्देशिका के बाहर अपने कस्टम स्क्रिप्ट में Magento इनिशियलाइज़ लाने के लिए क्या किया है।

//Required to include Magento functions.
$magento_dir "your/path/to/the/magento/installation/directory/";
require $magento_dir . 'app/bootstrap.php';
$bootstrap = \Magento\Framework\App\Bootstrap::create(BP, $_SERVER);
//$app = $bootstrap->createApplication('Magento\Framework\App\Http');
$app = $bootstrap->createApplication('MyClass');
$bootstrap->run($app);

यह Magento डॉक्स के अनुसार अनुशंसित तरीका है। http://devdocs.magento.com/guides/v2.0/config-guide/bootstrap/magento-bootstrap.html

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.