Magento 2 - CRUD và Model

Trong bài viết trên blog này, chúng ta sẽ xem làm thế nào để thiết lập Model trong Magento và làm hoạt động cơ sở dữ liệu liên quan.

Để module thiết lập trong magento chúng ta cần thêm nhiều tập tin. Cách nhanh nhất để làm điều này là sử dụng mã tạo ra các công cụ. Bạn có thể tìm thấy nhiều công cụ trực tuyến cho việc tạo mã magento2, nhưng một trong những tôi được sử dụng cho blog này là này

Bước 1: Tạo files cơ bản

Để cài đặt công cụ này, bạn vào thư mục gốc magento2 của bạn và chạy lệnh này

1
2
curl -LO http://pestle.pulsestorm.net/pestle.phar
chmod + x pestle.phar

chạy tiếp mã này

1
./pestle.phar generate_crud_model Abc_Hello Test

Điều này sẽ tạo ra tất cả các file cần thiết cho một module

1
2
3
4
5
6
Creating: /var/www/html/magento2/app/code/Abc/Hello/Model/TestInterface.php 
Creating: /var/www/html/magento2/app/code/Abc/Hello/Model/ResourceModel/Test/Collection.php 
Creating: /var/www/html/magento2/app/code/Abc/Hello/Model/ResourceModel/Test.php 
Creating: /var/www/html/magento2/app/code/Abc/Hello/Model/Test.php 
Creating: /var/www/html/magento2/app/code/Abc/Hello/Setup/InstallSchema.php 
Creating: /var/www/html/magento2/app/code/Abc/Hello/Setup/InstallData.php

Cho phép xem xét các tập tin trong chi tiết

Bước 2: cài đặt Script

Các tập tin xuất sắc / Hello / Setup / InstallSchema.php chứa mã lệnh tạo bảng cơ sở dữ liệu của bạn. Điều này được thực hiện chỉ một lần trong khi cài đặt module. Các nội dung cho các tập tin được

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
<?php
namespace Abc\Hello\Setup;
class InstallSchema implements \Magento\Framework\Setup\InstallSchemaInterface
{
    public function install(\Magento\Framework\Setup\SchemaSetupInterface $setup, \Magento\Framework\Setup\ModuleContextInterface $context)
    {
        $installer = $setup;
        $installer->startSetup();
        //START: install stuff
        //END:   install stuff
         
//START table setup
$table = $installer->getConnection()->newTable(
            $installer->getTable('abc_hello_test')
    )->addColumn(
            'abc_hello_test_id',
            \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER,
            null,
            [ 'identity' => true, 'nullable' => false, 'primary' => true, 'unsigned' => true, ],
            'Entity ID'
        )->addColumn(
            'title',
            \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
            255,
            [ 'nullable' => false, ],
            'Demo Title'
        )->addColumn(
            'creation_time',
            \Magento\Framework\DB\Ddl\Table::TYPE_TIMESTAMP,
            null,
            [ 'nullable' => false, 'default' => \Magento\Framework\DB\Ddl\Table::TIMESTAMP_INIT, ],
            'Creation Time'
        )->addColumn(
            'update_time',
            \Magento\Framework\DB\Ddl\Table::TYPE_TIMESTAMP,
            null,
            [ 'nullable' => false, 'default' => \Magento\Framework\DB\Ddl\Table::TIMESTAMP_INIT_UPDATE, ],
            'Modification Time'
        )->addColumn(
            'is_active',
            \Magento\Framework\DB\Ddl\Table::TYPE_SMALLINT,
            null,
            [ 'nullable' => false, 'default' => '1', ],
            'Is Active'
        );
$installer->getConnection()->createTable($table);
//END   table setup
$installer->endSetup();
    }
}

nhìn vào các nội dung tập tin, rõ ràng của nó như thế nào bảng được tạo ra. Bạn cũng có thể chỉnh sửa để tạo ra một bảng theo yêu cầu của bạn.

Các tập tin

1
Abc/Hello/Setup/InstallData.php
là để thiết lập dữ liệu ban đầu cho các mô-đun, nhưng chúng ta sẽ thảo luận rằng chi tiết sau.

Tại thời điểm này, nếu bạn nhìn vào bảng cơ sở dữ liệu của bạn, bạn sẽ không thấy bảng

1
abc_hello_test
trong cơ sở dữ liệu. Lý do là, chúng ta có trước đây đã được thiết lập module và phiên bản 0.0.1 đã được kích hoạt trong Magento. Vì vậy, magento sẽ không chạy các kịch bản thiết lập kể từ khi theo magento module đã được cài đặt.

Để khắc phục, xem bảng

1
'setup_module'
trong cơ sở dữ liệu magento2 của bạn. Nó cần phải có một mục nhập cho module của bạn
1
'Abc_Hello'
. Xóa mục nhập đó khỏi bàn và chạy lệnh

1
bin/magento setup:upgrade

Điều này sẽ chạy các kịch bản thiết lập một lần nữa và tạo ra các bảng của bạn.

Bước 3: Tạo file Model

Các module tập tin nằm ở ‘xuất sắc / Hello / mẫu / test.php’ Các mã trong tập tin là

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
namespace Abc\Hello\Model;
class Test extends \Magento\Framework\Model\AbstractModel implements TestInterface, \Magento\Framework\DataObject\IdentityInterface
{
    const CACHE_TAG = 'abc_hello_test';
 
    protected function _construct()
    {
        $this->_init('Abc\Hello\Model\ResourceModel\Test');
    }
 
    public function getIdentities()
    {
        return [self::CACHE_TAG . '_' . $this->getId()];
    }
}

Các CACHE_TAG là quan trọng trong magento2 cho các module. Chúng ta sẽ xem chi tiết là gì, chỉ nhớ nó phải là duy nhất cho mỗi module.

Để sử dụng các module trong khối chúng ta cần phải tiêm nó. Magento2 chúng ta luôn luôn chúng ta cần sự phụ thuộc tiêm, không bao giờ được chúng ta trực tiếp tạo ra Ví dụ khối sử dụng “mới” hoặc “Mage :: getModel”

Chúng ta hãy xem làm thế nào để sử dụng các module trong khối của chúng ta Trong khối của chúng ta xuất sắc \ Xin chào \ Khối \ Main, chúng ta sẽ bổ sung thêm mã này

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
namespace Abc\Hello\Block;
  
class Main extends \Magento\Framework\View\Element\Template
{   
    protected $_testFactory;
    public function __construct(
        \Magento\Framework\View\Element\Template\Context $context,
        \Abc\Hello\Model\TestFactory $testFactory
    )
    {
        $this->_testFactory = $testFactory;
        parent::__construct($context);
    }
    protected function _prepareLayout()
    {
    $test = $this->_testFactory->create();
        $test->setTitle('Test Title');
        $test->save();
        $this->setTestModel($test);
    }
}

Bạn nhận thấy rằng lớp

1
\Abc\Hello\Model\TestFactory
không tồn tại. Chúng tôi đã không tạo ra nó. Factory là loại đặc biệt của lớp trong magento 2. Bất kỳ lớp với Nhà máy tên trong nó, magento sẽ tự động tạo ra nó và đặt trong thư mục var/generation/vendor/module/model

Trong file mẫu

1
"content.phtml"
của chúng ta, chúng ta sẽ viết code

1
<h1><?php echo __('Model Saved With Entity ID %1',$block->getTestModel()->getData('abc_hello_test_id')); ?></h1>

Khi bạn mở url, nó sẽ làm các mục cơ sở dữ liệu và hiển thị ID.

module Magento2 là khá nhiều giống như module magento1, vì vậy chức năng như tải này (), xóa (), vv tất cả các công việc

1
2
3
4
5
6
7
8
$test = $this->_testFactory->create();
$test->setTitle('Test Title');
$test->save();
 
$test->load(2); 
print_r($test->getData());
 
$test->delete(2);

Bước 4: Collection

Bộ sưu tập được đặt tại “Abc \ Xin chào \ mẫu \ ResourceModel \ Test \ Collection.php ‘với mã

1
2
3
4
5
6
7
8
9
<?php
namespace Abc\Hello\Model\ResourceModel\Test;
class Collection extends \Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection
{
    protected function _construct()
    {
        $this->_init('Abc\Hello\Model\Test','Abc\Hello\Model\ResourceModel\Test');
    }
}

Chúng tôi có thể làm hoạt động sưu tập tiêu chuẩn như magento1 như

1
2
3
4
5
$test = $this->_testFactory->create();
$collection = $test->getCollection();
foreach($collection as $row){
   print_r($row->getData());
}

Bước 5: Resource Model

Tài nguyên mẫu của là những nơi mà các truy vấn sql thực tế được thực thi. Mô hình tập tin chứa logic cơ sở dữ liệu tổng thể, nhưng tập tin tài nguyên làm các hoạt động sql thực tế. Ví dụ: Trong module tập tin của bạn, bạn có thể viết mã này

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
namespace Abc\Hello\Model;
class Test extends \Magento\Framework\Model\AbstractModel implements TestInterface, \Magento\Framework\DataObject\IdentityInterface
{
    const CACHE_TAG = 'abc_hello_test';
 
    protected function _construct()
    {
        $this->_init('Abc\Hello\Model\ResourceModel\Test');
    }
 
    public function getIdentities()
    {
        return [self::CACHE_TAG . '_' . $this->getId()];
    }
    public function loadByTitle($title){
        if(!$title){
            $title = $this->getTitle();
            //random data logic. can be much more complex.
            //this is just example
        }
        $id = $this->getResource()->loadByTitle($title);
        return $this->load($id);
    }
}

và module tài nguyên sẽ có mã này

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
namespace Abc\Hello\Model\ResourceModel;
class Test extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb
{
    protected function _construct()
    {
        $this->_init('abc_hello_test','abc_hello_test_id');
    }
    public function loadByTitle($title){
        $table = $this->getMainTable();
        $where = $this->getConnection()->quoteInto("title = ?", $title);
        $sql = $this->getConnection()->select()->from($table,array('abc_hello_test_id'))->where($where);
        $id = $this->getConnection()->fetchOne($sql);
        return $id;
    }
}

và trong tập tin khối của chúng ta, chúng ta gọi là module chức năng

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
namespace Abc\Hello\Block;
  
class Main extends \Magento\Framework\View\Element\Template
{   
    protected $_testFactory;
    public function __construct(
        \Magento\Framework\View\Element\Template\Context $context,
        \Abc\Hello\Model\TestFactory $testFactory
    )
    {
        $this->_testFactory = $testFactory;
        parent::__construct($context);
    }
    protected function _prepareLayout()
    {
        $test = $this->_testFactory->create();
        $test->loadByTitle('Test Title');
        $this->setTestModel($test);
         
    }
}

Đây là một mẫu thiết kế quan trọng trong magento, module nên có logic cơ sở dữ liệu và module tài nguyên các hoạt động sql thực tế.

Comments