<h5 style="color:red;">系统学习magento二次开发,推荐小册:<a style="color:blue;" href="https://www.maxiaoke.com/manual/magento_cn_dev.html" target="_blank">《Magento中文全栈二次开发 》</a></h5> <div class="image-container"> <p> <a style="color:blue;" href="https://www.maxiaoke.com/manual/magento_cn_dev.html" target="_blank"> <img src="https://www.maxiaoke.com/uploads/images/20230218/bb9c82995c24d1105676e02f373755f5.jpg" alt="Magento中文全栈二次开发"> </a> </p> </div> <div class="text-container" style="font-size:14px; color:#888"> <p>本小册面向Magento2以上版本,书代码及示例兼容magento2.0-2.4版本。涵盖了magento前端开发,后端开发,magento2主题,magento2重写,magento2 layout,magento2控制器,magento2 block等相关内容,带领您成为magento开发技术专家。</p> </div> <hr><p>在Magento 2中,对象管理器(Object Manager)是一个用于创建和管理类实例的核心组件。您可以使用对象管理器来获取Magento 2中的各种类的实例。以下是一个简单的示例:</p><p><br/></p><pre class="brush:as3;toolbar:false">use Magento\Framework\App\ObjectManager; use Magento\Catalog\Api\ProductRepositoryInterface; class MyCustomClass { private $productRepository; public function __construct() { $objectManager = ObjectManager::getInstance(); $this->productRepository = $objectManager->get(ProductRepositoryInterface::class); } public function getProductById($id) { return $this->productRepository->getById($id); } }</pre><p>在上面的示例中,我们创建了一个名为 MyCustomClass 的类,并使用对象管理器获取了 ProductRepositoryInterface 的实例。我们还在构造函数中初始化了 $productRepository 属性,并使用该属性来获取指定 $id 的产品。</p><p><br/></p><p>虽然使用对象管理器可以方便地获取Magento 2中的类的实例,但它不是最佳实践。因为使用对象管理器会导致代码耦合,使代码难以测试和维护。Magento 2推荐使用依赖注入来获取所需的类实例,而不是使用对象管理器。</p><p><br/></p>
文章列表
<h5 style="color:red;">系统学习magento二次开发,推荐小册:<a style="color:blue;" href="https://www.maxiaoke.com/manual/magento_cn_dev.html" target="_blank">《Magento中文全栈二次开发 》</a></h5> <div class="image-container"> <p> <a style="color:blue;" href="https://www.maxiaoke.com/manual/magento_cn_dev.html" target="_blank"> <img src="https://www.maxiaoke.com/uploads/images/20230218/bb9c82995c24d1105676e02f373755f5.jpg" alt="Magento中文全栈二次开发"> </a> </p> </div> <div class="text-container" style="font-size:14px; color:#888"> <p>本小册面向Magento2以上版本,书代码及示例兼容magento2.0-2.4版本。涵盖了magento前端开发,后端开发,magento2主题,magento2重写,magento2 layout,magento2控制器,magento2 block等相关内容,带领您成为magento开发技术专家。</p> </div> <hr><p>在Magento 2中,依赖注入是一种设计模式,用于从对象本身的构造函数中获取所需的依赖项,而不是通过对象管理器或其他方式进行实例化。</p><p><br/></p><p>以下是一个简单的示例:</p><pre class="brush:as3;toolbar:false"> use Magento\Catalog\Api\ProductRepositoryInterface; class MyCustomClass { private $productRepository; public function __construct(ProductRepositoryInterface $productRepository) { $this->productRepository = $productRepository; } public function getProductById($id) { return $this->productRepository->getById($id); } }</pre><p>在上面的示例中,我们创建了一个名为 MyCustomClass 的类,并在构造函数中声明了 ProductRepositoryInterface 依赖项。通过这种方式,我们可以使用依赖注入来传递 ProductRepositoryInterface 实例,并将其存储在 $productRepository 属性中。</p><p><br/></p><p>使用依赖注入可以帮助我们减少代码耦合,使代码更容易测试和维护。同时,在Magento 2中,依赖注入还可以使用XML配置文件和自动生成的代码来自动注入所需的依赖项。</p><p><br/></p>
<h5 style="color:red;">系统学习magento二次开发,推荐小册:<a style="color:blue;" href="https://www.maxiaoke.com/manual/magento_cn_dev.html" target="_blank">《Magento中文全栈二次开发 》</a></h5> <div class="image-container"> <p> <a style="color:blue;" href="https://www.maxiaoke.com/manual/magento_cn_dev.html" target="_blank"> <img src="https://www.maxiaoke.com/uploads/images/20230218/bb9c82995c24d1105676e02f373755f5.jpg" alt="Magento中文全栈二次开发"> </a> </p> </div> <div class="text-container" style="font-size:14px; color:#888"> <p>本小册面向Magento2以上版本,书代码及示例兼容magento2.0-2.4版本。涵盖了magento前端开发,后端开发,magento2主题,magento2重写,magento2 layout,magento2控制器,magento2 block等相关内容,带领您成为magento开发技术专家。</p> </div> <hr><p>在Magento 2中,公共接口和API是用于与Magento 2的其他系统或第三方应用程序进行交互的关键组件。它们允许您从外部应用程序中访问Magento 2的核心功能和数据。</p><p><br/></p><p>以下是一个简单的示例:</p><p><br/></p><pre class="brush:as3;toolbar:false">use Magento\Framework\Api\SearchCriteriaBuilder; use Magento\Customer\Api\CustomerRepositoryInterface; class MyCustomClass { private $customerRepository; private $searchCriteriaBuilder; public function __construct(CustomerRepositoryInterface $customerRepository, SearchCriteriaBuilder $searchCriteriaBuilder) { $this->customerRepository = $customerRepository; $this->searchCriteriaBuilder = $searchCriteriaBuilder; } public function getCustomerByEmail($email) { $searchCriteria = $this->searchCriteriaBuilder->addFilter('email', $email)->create(); $customerList = $this->customerRepository->getList($searchCriteria)->getItems(); if (count($customerList) > 0) { return $customerList[0]; } return null; } }</pre><p>在上面的示例中,我们创建了一个名为 MyCustomClass 的类,并在构造函数中注入了 CustomerRepositoryInterface 和 SearchCriteriaBuilder。通过这些接口,我们可以获取指定电子邮件的客户。</p><p><br/></p><p>值得注意的是,API和公共接口在Magento 2中使用相同的接口类型。它们只是根据使用方式和访问权限进行分类。例如,CustomerRepositoryInterface 是公共接口,因此只能用于在Magento 2中运行的代码中,而不是在外部应用程序中使用。</p><p><br/></p><p>如果您想要使用Magento 2的API来与外部应用程序进行交互,则可以使用Web API。Web API 允许您使用HTTP请求(例如GET、POST、PUT和DELETE)来调用Magento 2的功能和服务。要使用Web API,您需要首先在Magento 2后端配置Web API访问和授权,并为每个要使用的API端点生成令牌。然后,您可以使用curl或其他HTTP客户端来调用API端点。以下是一个简单的示例:</p><p><br/></p><p><br/></p><p>curl -X GET <span style="color: #ce9178;">"http://magento2-base-url/rest/V1/products?searchCriteria[pageSize]=10"</span> -H <span style="color: #ce9178;">"Authorization: Bearer <token>"</span></p><p>在上面的示例中,我们使用curl来调用Magento 2的Web API,以获取前10个产品。我们在请求标头中包含了一个有效的令牌,以便进行身份验证和授权。</p><p><br/></p>
<h5 style="color:red;">系统学习magento二次开发,推荐小册:<a style="color:blue;" href="https://www.maxiaoke.com/manual/magento_cn_dev.html" target="_blank">《Magento中文全栈二次开发 》</a></h5> <div class="image-container"> <p> <a style="color:blue;" href="https://www.maxiaoke.com/manual/magento_cn_dev.html" target="_blank"> <img src="https://www.maxiaoke.com/uploads/images/20230218/bb9c82995c24d1105676e02f373755f5.jpg" alt="Magento中文全栈二次开发"> </a> </p> </div> <div class="text-container" style="font-size:14px; color:#888"> <p>本小册面向Magento2以上版本,书代码及示例兼容magento2.0-2.4版本。涵盖了magento前端开发,后端开发,magento2主题,magento2重写,magento2 layout,magento2控制器,magento2 block等相关内容,带领您成为magento开发技术专家。</p> </div> <hr><p>服务契约设计模式是一种基于接口的设计模式,用于定义服务的行为和数据结构。在Magento 2中,服务契约用于定义模块之间的接口,以便实现松散耦合和更好的可扩展性。</p><p><br/></p><p>Magento 2中的服务契约通常使用Interface后缀命名。例如,以下是一个定义了一个计算器服务的接口:</p><p><br/></p><pre class="brush:as3;toolbar:false">namespace MyVendor\MyModule\Api; interface CalculatorInterface { /** * Adds two numbers together and returns the result. * * @param float $a The first number to add. * @param float $b The second number to add. * @return float The sum of the two numbers. */ public function add($a, $b); }</pre><p>在上面的代码中,我们定义了一个名为 CalculatorInterface 的接口,并定义了一个名为 add() 的方法,该方法接受两个参数并返回它们的和。请注意,我们在方法注释中提供了有关方法行为的详细说明。这些注释非常重要,因为它们可以让其他开发人员更容易地了解如何使用您的服务。</p><p><br/></p><p>接口定义后,我们可以通过实现该接口的类来提供服务。以下是一个实现 CalculatorInterface 接口的示例:</p><p><br/></p><pre class="brush:as3;toolbar:false">namespace MyVendor\MyModule\Model; use MyVendor\MyModule\Api\CalculatorInterface; class Calculator implements CalculatorInterface { public function add($a, $b) { return $a + $b; } }</pre><p>在上面的代码中,我们创建了一个名为 Calculator 的类,并实现了 CalculatorInterface 接口中定义的 add() 方法。这个方法执行加法操作并返回结果。</p><p><br/></p><p>现在,我们可以使用Magento 2的对象管理器来访问我们的服务。以下是一个使用 Calculator 服务的示例:</p><p><br/></p><pre class="brush:as3;toolbar:false">use MyVendor\MyModule\Api\CalculatorInterface; use Magento\Framework\App\Action\Action; class MyCustomAction extends Action { private $calculator; public function __construct(CalculatorInterface $calculator) { $this->calculator = $calculator; } public function execute() { $result = $this->calculator->add(2, 3); echo "The result is: " . $result; } }</pre><p>在上面的代码中,我们创建了一个名为 MyCustomAction 的类,并注入了 CalculatorInterface 接口。我们在 execute() 方法中调用 Calculator 服务的 add() 方法,并将结果打印到屏幕上。</p><p><br/></p><p>使用服务契约设计模式可以使代码更易于理解、测试和维护。它使您的代码更加灵活和可扩展,因为它们能够轻松地与其他模块和第三方应用程序进行交互。</p><p><br/></p>
<h5 style="color:red;">系统学习magento二次开发,推荐小册:<a style="color:blue;" href="https://www.maxiaoke.com/manual/magento_cn_dev.html" target="_blank">《Magento中文全栈二次开发 》</a></h5> <div class="image-container"> <p> <a style="color:blue;" href="https://www.maxiaoke.com/manual/magento_cn_dev.html" target="_blank"> <img src="https://www.maxiaoke.com/uploads/images/20230218/bb9c82995c24d1105676e02f373755f5.jpg" alt="Magento中文全栈二次开发"> </a> </p> </div> <div class="text-container" style="font-size:14px; color:#888"> <p>本小册面向Magento2以上版本,书代码及示例兼容magento2.0-2.4版本。涵盖了magento前端开发,后端开发,magento2主题,magento2重写,magento2 layout,magento2控制器,magento2 block等相关内容,带领您成为magento开发技术专家。</p> </div> <hr><p>在 Magento 2 中,可以使用异步和延迟操作来提高应用程序的性能和可伸缩性。异步操作允许在后台执行长时间运行的任务,而不会阻塞应用程序的其他部分。延迟操作允许将任务推迟到稍后执行,以避免阻塞当前操作。</p><p><br/></p><p>以下是在 Magento 2 中使用异步和延迟操作的代码示例:</p><p><br/></p><p>异步操作</p><p></p><pre class="brush:as3;toolbar:false"><?php use Magento\Framework\App\Bootstrap; use Magento\Framework\App\Http; use Magento\Framework\MessageQueue\PublisherInterface; require __DIR__ . '/../app/bootstrap.php'; $params = $_SERVER; $bootstrap = Bootstrap::create(BP, $params); $app = $bootstrap->createApplication(Http::class); $bootstrap->run($app); /** @var PublisherInterface $publisher */ $publisher = $bootstrap->getObjectManager()->get(PublisherInterface::class); $message = ['order_id' => 1234, 'customer_id' => 5678]; $publisher->publish('order.queue', $message);</pre><p><span style="color: #6a9955;"></span><br/></p><p>在此示例中,我们使用 PublisherInterface 将消息发布到名为 order.queue 的消息队列中。然后,可以使用消息队列消费者来异步处理该消息。</p><p><br/></p><p>延迟操作</p><p></p><pre class="brush:as3;toolbar:false"><?php use Magento\Framework\App\Bootstrap; use Magento\Framework\App\Http; use Magento\Framework\MessageQueue\PublisherInterface; use Magento\Framework\MessageQueue\EnvelopeFactory; use Magento\Framework\MessageQueue\DelayStrategy\Simple as DelayStrategy; require __DIR__ . '/../app/bootstrap.php'; $params = $_SERVER; $bootstrap = Bootstrap::create(BP, $params); $app = $bootstrap->createApplication(Http::class); $bootstrap->run($app); /** @var PublisherInterface $publisher */ $publisher = $bootstrap->getObjectManager()->get(PublisherInterface::class); /** @var EnvelopeFactory $envelopeFactory */ $envelopeFactory = $bootstrap->getObjectManager()->get(EnvelopeFactory::class); /** @var DelayStrategy $delayStrategy */ $delayStrategy = $bootstrap->getObjectManager()->get(DelayStrategy::class); $message = ['order_id' => 1234, 'customer_id' => 5678]; $delay = 600; // 10 minutes $envelope = $envelopeFactory->create(['body' => $message]); $envelope->setDelay($delayStrategy->getDelay($delay)); $publisher->publish('order.queue', $envelope);</pre><p><span style="color: #6a9955;"></span><br/></p><p>在此示例中,我们使用 DelayStrategy 来将消息推迟10分钟,然后使用 EnvelopeFactory 创建一个带有延迟的消息。然后,我们使用 PublisherInterface 将消息发布到名为 order.queue 的消息队列中。</p><p><br/></p><p>请注意,为了在 Magento 2 中使用异步和延迟操作,需要先安装和配置一个消息队列后端,例如 RabbitMQ 或 Amazon SQS。</p><p><br/></p>
<h5 style="color:red;">系统学习magento二次开发,推荐小册:<a style="color:blue;" href="https://www.maxiaoke.com/manual/magento_cn_dev.html" target="_blank">《Magento中文全栈二次开发 》</a></h5> <div class="image-container"> <p> <a style="color:blue;" href="https://www.maxiaoke.com/manual/magento_cn_dev.html" target="_blank"> <img src="https://www.maxiaoke.com/uploads/images/20230218/bb9c82995c24d1105676e02f373755f5.jpg" alt="Magento中文全栈二次开发"> </a> </p> </div> <div class="text-container" style="font-size:14px; color:#888"> <p>本小册面向Magento2以上版本,书代码及示例兼容magento2.0-2.4版本。涵盖了magento前端开发,后端开发,magento2主题,magento2重写,magento2 layout,magento2控制器,magento2 block等相关内容,带领您成为magento开发技术专家。</p> </div> <hr><p>在 Magento 2 中,可以创建自定义命令,这些命令可以通过命令行界面使用。这些自定义命令可以帮助你自动化一些常见任务,例如导入数据、运行测试等等。下面是创建一个简单的自定义命令的代码示例:</p><p><br/></p><p>创建自定义命令的类</p><p>首先,需要创建一个继承自 Symfony\Component\Console\Command\Command 的 PHP 类。这个类需要实现两个方法:configure() 和 execute()。configure() 方法用于配置命令的名称、描述、参数和选项,而 execute() 方法用于定义命令的行为。</p><p><br/></p><pre class="brush:as3;toolbar:false"><?php namespace Namespace\Module\Console\Command; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; class CustomCommand extends Command { protected function configure() { $this->setName('namespace:command:name') ->setDescription('Description of the custom command') ->setDefinition([]); parent::configure(); } protected function execute(InputInterface $input, OutputInterface $output) { $output->writeln('Custom command executed.'); return \Magento\Framework\Console\Cli::RETURN_SUCCESS; } }</pre><p>注册自定义命令</p><p>将自定义命令的类注册到 Magento 2 的命令行界面。需要创建一个 di.xml 文件,使用 Magento\Framework\Console\CommandList 类的 add() 方法将自定义命令添加到命令列表中。</p><p><br/></p><pre class="brush:as3;toolbar:false"><?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="custom_command" xsi:type="object">Namespace\Module\Console\Command\CustomCommand</item> </argument> </arguments> </type> </config></pre><p>运行自定义命令</p><p>现在,可以使用 bin/magento 脚本运行自定义命令了。例如:</p><pre class="brush:as3;toolbar:false">bin/magento namespace:command:name</pre><p>这将执行刚刚创建的自定义命令,并输出 Custom command executed.。</p><p><br/></p><p>这是一个简单的示例,你可以在自定义命令的 execute() 方法中编写复杂的逻辑,例如读取或写入数据库、调用 API 等等。</p><p><br/></p>
<h5 style="color:red;">系统学习magento二次开发,推荐小册:<a style="color:blue;" href="https://www.maxiaoke.com/manual/magento_cn_dev.html" target="_blank">《Magento中文全栈二次开发 》</a></h5> <div class="image-container"> <p> <a style="color:blue;" href="https://www.maxiaoke.com/manual/magento_cn_dev.html" target="_blank"> <img src="https://www.maxiaoke.com/uploads/images/20230218/bb9c82995c24d1105676e02f373755f5.jpg" alt="Magento中文全栈二次开发"> </a> </p> </div> <div class="text-container" style="font-size:14px; color:#888"> <p>本小册面向Magento2以上版本,书代码及示例兼容magento2.0-2.4版本。涵盖了magento前端开发,后端开发,magento2主题,magento2重写,magento2 layout,magento2控制器,magento2 block等相关内容,带领您成为magento开发技术专家。</p> </div> <hr><p>在 Magento 2 中,命令的命名准则遵循以下规则:</p><p><br/></p><p>命令名称应该由两个或多个单词组成,使用冒号(:)分隔。第一个单词表示命令所属的模块或命名空间,第二个单词是具体的命令名称。</p><p>命令名称应该全部小写,使用连字符(-)分隔单词。例如:namespace:command-name</p><p>命令名称应该是独一无二的,以避免与其他模块或命名空间中的命令名称冲突。</p><p>下面是一个符合命名准则的自定义命令的代码示例:</p><p><br/></p><pre class="brush:as3;toolbar:false"><?php namespace Namespace\Module\Console\Command; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; class CustomCommand extends Command { protected function configure() { $this->setName('namespace:custom-command') ->setDescription('Description of the custom command') ->setDefinition([]); parent::configure(); } protected function execute(InputInterface $input, OutputInterface $output) { $output->writeln('Custom command executed.'); return \Magento\Framework\Console\Cli::RETURN_SUCCESS; } }</pre><p>该自定义命令的名称是 namespace:custom-command,符合 Magento 2 的命名准则。</p><p><br/></p>
<h5 style="color:red;">系统学习magento二次开发,推荐小册:<a style="color:blue;" href="https://www.maxiaoke.com/manual/magento_cn_dev.html" target="_blank">《Magento中文全栈二次开发 》</a></h5> <div class="image-container"> <p> <a style="color:blue;" href="https://www.maxiaoke.com/manual/magento_cn_dev.html" target="_blank"> <img src="https://www.maxiaoke.com/uploads/images/20230218/bb9c82995c24d1105676e02f373755f5.jpg" alt="Magento中文全栈二次开发"> </a> </p> </div> <div class="text-container" style="font-size:14px; color:#888"> <p>本小册面向Magento2以上版本,书代码及示例兼容magento2.0-2.4版本。涵盖了magento前端开发,后端开发,magento2主题,magento2重写,magento2 layout,magento2控制器,magento2 block等相关内容,带领您成为magento开发技术专家。</p> </div> <hr><p>在 Magento 2 中,可以使用 Cache Manager 来创建和管理缓存。Cache Manager 可以帮助您在代码中缓存任何数据,包括私有内容。</p><p><br/></p><p>以下是一个示例,演示如何使用 Cache Manager 缓存私有内容:</p><p><br/></p><pre class="brush:as3;toolbar:false"><?php namespace Namespace\Module\Block; use Magento\Framework\View\Element\Template\Context; use Magento\Framework\App\Cache\TypeListInterface; use Magento\Framework\App\Cache\Frontend\Pool; use Magento\Framework\App\Cache\StateInterface; class CustomBlock extends \Magento\Framework\View\Element\Template { protected $_cacheManager; public function __construct( Context $context, TypeListInterface $cacheTypeList, Pool $cacheFrontendPool, StateInterface $cacheState, array $data = [] ) { $this->_cacheManager = $context->getCacheManager(); parent::__construct($context, $data); } protected function _toHtml() { $cacheKey = 'my_custom_block'; $cacheTag = ['my_custom_block_tag']; if ($this->_cacheManager->load($cacheKey)) { return $this->_cacheManager->load($cacheKey); } $result = 'My Custom Block Content'; $this->_cacheManager->save($result, $cacheKey, $cacheTag); return $result; } }</pre><p>在上面的示例中,我们使用 _cacheManager 对象来缓存自定义块的私有内容。我们首先尝试从缓存中获取内容,如果找到了缓存,就直接返回缓存内容。否则,我们创建我们的内容,并将其保存到缓存中以备下次使用。</p><p><br/></p><p>我们使用 load() 方法从缓存中加载内容,该方法接受一个缓存键作为参数。如果找到了缓存,它会返回缓存内容,否则返回 false。</p><p><br/></p><p>我们使用 save() 方法将内容保存到缓存中。该方法接受三个参数:缓存内容、缓存键和缓存标签。缓存标签可以用于标记缓存,以便在需要清除缓存时进行识别。</p><p><br/></p><p>缓存管理器还提供其他方法,例如 remove() 和 clean(),用于清除缓存。</p><p><br/></p>
<h5 style="color:red;">系统学习magento二次开发,推荐小册:<a style="color:blue;" href="https://www.maxiaoke.com/manual/magento_cn_dev.html" target="_blank">《Magento中文全栈二次开发 》</a></h5> <div class="image-container"> <p> <a style="color:blue;" href="https://www.maxiaoke.com/manual/magento_cn_dev.html" target="_blank"> <img src="https://www.maxiaoke.com/uploads/images/20230218/bb9c82995c24d1105676e02f373755f5.jpg" alt="Magento中文全栈二次开发"> </a> </p> </div> <div class="text-container" style="font-size:14px; color:#888"> <p>本小册面向Magento2以上版本,书代码及示例兼容magento2.0-2.4版本。涵盖了magento前端开发,后端开发,magento2主题,magento2重写,magento2 layout,magento2控制器,magento2 block等相关内容,带领您成为magento开发技术专家。</p> </div> <hr><p>Magento 2 中的缓存分为多种类型,其中包括缓存页面、布局、块、对象、集合和配置等。下面是一些常见的缓存类型和代码示例:</p><p>缓存页面</p><p>缓存页面是 Magento 2 中的一种缓存类型,它将整个页面缓存起来,以便下次访问时可以直接从缓存中读取。要使用 Magento 2 的页面缓存,您可以在布局文件中使用 <span style="color: #569cd6;">cacheable</span>=<span style="color: #ce9178;">"true"</span> 标记。</p><pre class="brush:as3;toolbar:false"><page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd" layout="2columns-left" cacheable="true"> <!-- 页面内容 --> </page></pre><p>缓存块</p><p>缓存块是 Magento 2 中的另一种缓存类型,它可以将单个块的内容缓存起来,以便下次访问时可以直接从缓存中读取。要使用 Magento 2 的块缓存,您可以在块的 PHP 类中使用 <span style="color: #569cd6;">cacheable</span>=<span style="color: #ce9178;">"true"</span> 标记。</p><p><br/></p><p>例如,下面是一个使用块缓存的 PHP 类示例:</p><p><br/></p><p><br/></p><pre class="brush:as3;toolbar:false"><?php namespace Vendor\Module\Block; use Magento\Framework\View\Element\Template; class MyBlock extends Template { /** * @var bool */ protected $_isScopePrivate = true; /** * @return bool */ protected function _isAllowed() { return $this->_authorization->isAllowed('Vendor_Module::my_resource'); } /** * @return string */ public function getCacheKeyInfo() { return [ 'VENDOR_MODULE_MYBLOCK', $this->_storeManager->getStore()->getId(), $this->_design->getDesignTheme()->getId(), $this->_customerSession->getCustomerGroupId(), intval($this->_customerSession->isLoggedIn()), $this->getRequest()->getParam('id'), $this->_scopeConfig->getValue('vendor/module/feature_enabled') ]; } }</pre><p>在上面的示例中,我们可以看到 MyBlock 类继承自 Template 类,并实现了 getCacheKeyInfo() 方法和 _isScopePrivate 属性,这使得块的内容可以被缓存起来。</p><p><br/></p>
<h5 style="color:red;">系统学习magento二次开发,推荐小册:<a style="color:blue;" href="https://www.maxiaoke.com/manual/magento_cn_dev.html" target="_blank">《Magento中文全栈二次开发 》</a></h5> <div class="image-container"> <p> <a style="color:blue;" href="https://www.maxiaoke.com/manual/magento_cn_dev.html" target="_blank"> <img src="https://www.maxiaoke.com/uploads/images/20230218/bb9c82995c24d1105676e02f373755f5.jpg" alt="Magento中文全栈二次开发"> </a> </p> </div> <div class="text-container" style="font-size:14px; color:#888"> <p>本小册面向Magento2以上版本,书代码及示例兼容magento2.0-2.4版本。涵盖了magento前端开发,后端开发,magento2主题,magento2重写,magento2 layout,magento2控制器,magento2 block等相关内容,带领您成为magento开发技术专家。</p> </div> <hr><p>在 Magento 2 中,可以通过创建自定义的缓存类型来缓存您的应用程序数据。下面是一个示例,演示如何在 Magento 2 中创建自定义缓存类型:</p><p><br/></p><pre class="brush:as3;toolbar:false"><?php namespace Namespace\Module\Model\Cache\Type; use Magento\Framework\App\Cache\Type\FrontendPool; use Magento\Framework\Cache\Frontend\Decorator\TagScope; class CustomCacheType extends TagScope { const CACHE_TYPE = 'custom_cache_type'; public function __construct(FrontendPool $cacheFrontendPool) { parent::__construct($cacheFrontendPool->get(self::CACHE_TYPE), self::CACHE_TYPE); } }</pre><p>在上面的示例中,我们创建了一个名为 CustomCacheType 的自定义缓存类型,并继承了 TagScope 类来支持标签。</p><p><br/></p><p>我们定义了 CACHE_TYPE 常量来表示缓存类型的名称。</p><p><br/></p><p>我们在 __construct() 方法中获取缓存实例,并将其传递给 TagScope 类的构造函数。</p><p><br/></p><p>接下来,我们需要在 di.xml 文件中注册缓存类型:</p><p><br/></p><pre class="brush:as3;toolbar:false"><config> <type name="Namespace\Module\Model\Cache\Type\CustomCacheType"> <arguments> <argument name="cacheFrontendPool" xsi:type="object">Magento\Framework\App\Cache\Type\FrontendPool</argument> </arguments> </type> </config></pre><p>在上面的示例中,我们将 Namespace\Module\Model\Cache\Type\CustomCacheType 类型注册为缓存类型,并传递了 cacheFrontendPool 依赖项。</p><p><br/></p><p>现在,我们可以在代码中使用我们的自定义缓存类型。例如,以下是一个示例,演示如何在 Magento 2 中使用自定义缓存类型:</p><p><br/></p><pre class="brush:as3;toolbar:false"><?php namespace Namespace\Module\Block; use Namespace\Module\Model\Cache\Type\CustomCacheType; class CustomBlock extends \Magento\Framework\View\Element\Template { protected $cacheType; public function __construct( \Magento\Framework\View\Element\Template\Context $context, CustomCacheType $cacheType, array $data = [] ) { parent::__construct($context, $data); $this->cacheType = $cacheType; } protected function _toHtml() { $cacheKey = 'my_cache_key'; $cacheData = $this->cacheType->load($cacheKey); if (!$cacheData) { $cacheData = 'My cached data'; $this->cacheType->save($cacheData, $cacheKey, [], 86400); // 缓存时间为一天 } return $cacheData; } }</pre><p>在上面的示例中,我们在 __construct() 方法中注入了我们的自定义缓存类型 CustomCacheType。在 _toHtml() 方法中,我们使用 load() 方法来从缓存中获取数据,并使用 save() 方法将数据保存到缓存中。</p><p><br/></p><p>当缓存启用时,Magento 2 会在页面加载时自动缓存块。Magento 2 会检查缓存是否存在并且没有过期,如果找到了缓存,则直接从缓存中获取内容,否则会生成新的内容并将其保存到缓存中以备下次使用</p><p><br/></p>