Memigrasi proyek dari yii1 ke yii2 melalui pekerjaan satu kali



“Beberapa kali” Saya harus berurusan dengan migrasi proyek dari yii1 ke yii2 dan saya ingin berbagi pengalaman saya dengan masyarakat. Tidak ada yang rumit dalam proses ini dan tidak akan ada wahyu. Sifat publikasi adalah tutorial + pengalaman Anda untuk pemula.

Latar belakang


Jika proyek-proyek yang dibuat secara historis pada versi pertama yii terus berkembang, maka setiap pengembang yang bekerja dengannya cepat atau lambat muncul dengan pemikiran: " seberapa baik jika jika pada yii2 ".

Tetapi hal-hal biasanya tidak melampaui pikiran, karena jumlah pekerjaan tampaknya kolosal. Secara umum, seperti apa adanya, volumenya sangat besar, tetapi masih tidak menghalangi - menurut pepatah "mata takut". Ditambah lagi, untuk transisi ke tindakan, kemauan keras tertentu diperlukan (saya, secara internal, telah mempersiapkan migrasi proyek pertama selama hampir satu tahun).

Ide saya tentang migrasi ada di bawah kucing.

Sebelum "menunjukkan kode" Saya akan menulis banyak surat "mengapa saya melakukan ini", karena alasan menentukan sifat pekerjaan. Saya punya 2 kasus serupa.

Dalam proyek pertama, semuanya sederhana. Saya adalah pemilik bersama dan satu-satunya pengembang. Oleh karena itu, alasan "Aku bosan menulis di yii1" cukup menarik. Menulis harus "tinggi", jika tidak hasilnya mungkin omong kosong berkualitas buruk.

Dalam kasus kedua, saya seorang kontraktor dalam proyek yang telah ditulis oleh berbagai pengembang untuk waktu yang lama tanpa arsitektur yang jelas. Oleh karena itu, hasilnya adalah banyak kode warisan. Menulis ulang seperti ini lebih mudah untuk membuat Anda berhenti merokok, pelanggan tidak mengenali refactoring hanya untuk refactoring, sehingga setiap pengembang baru semakin bertambah.

Situasinya macet: Semua orang mengerti bahwa ada masalah dengan kode, tetapi mereka tidak dapat keluar dari lingkaran ini. Saya menyarankan migrasi modular bertahap ke yii2. Setelah 1,5 bulan, bagian dari situs mulai bekerja pada yii2, yang berarti ada tempat untuk bermigrasi dan infrastruktur tempat Anda dapat bekerja secara bermakna. Tentu saja, Anda dapat terus menulis dengan buruk, tetapi Anda tidak bisa lagi membenarkan diri Anda dengan “lihat apa yang ada di sekitar”.

Pikirkan Sebelum Memulai


Bagi saya sendiri, saya telah mengidentifikasi beberapa aturan. Jika Anda memulai migrasi, maka mereka harus dihormati, atau Anda tidak boleh memulainya.

  1. Kita perlu memahami dan menerima "mengapa kita membutuhkan wasir." Mungkin ada motivasi apa pun, tetapi harus lebih besar daripada semua kerugiannya dengan margin yang besar.
  2. Anda tidak boleh memulai migrasi jika proyek tidak memiliki masa depan yang jelas dalam perkiraan selama 2-3 tahun sebelumnya. Atau Anda melakukannya untuk bersenang-senang.
  3. Kami menulis semua fungsi baru, semua pengembangan, semua baru di yii2. Pada yii1, hanya dukungan yang harus tetap. Jika aturan ini tidak diikuti, maka Anda akan segera menerima 2 cabang aktif, yang akan membutuhkan sumber daya 2 kali lebih banyak. Dan, karena selalu tidak ada sumber daya yang cukup, maka ini semua mungkin berakhir.
  4. Jangan mengatur tugas "tulis ulang dengan bodoh semua yang ada." "Menulis ulang semuanya" sangat abstrak dan membosankan sehingga jika Anda menyuarakannya kepada tim Anda dalam kata-kata ini, maka Anda dapat membaca banyak hal menarik tentang mereka di wajah sedih mereka.
  5. Karena bahkan jika "semua yang Anda inginkan" tidak dapat ditulis ulang segera, maka Anda memerlukan rencana untuk migrasi bertahap - berdasarkan halaman, layanan, modul.
  6. Yang paling penting! Yang terbaik adalah mempertimbangkan migrasi ke yii2 sebagai refactoring mendalam dari seluruh proyek yang ditujukan untuk pengembangan. Maka mungkin ternyata bahwa sepertiga dari proyek tidak perlu ditulis ulang sama sekali (jika berfungsi dengan baik "sebagaimana adanya" dan hanya membutuhkan dukungan minimal), dan bagian dari proyek dapat dikubur dengan indah. Yaitu tidak hanya membunuh layanan / halaman, tetapi juga mengulang proyek sehingga mereka tidak diperlukan.

Ide migrasi


Gagasan saya tentang migrasi adalah kolaborasi simultan dari dua cabang proyek yang sama pada yii1 dan yii2 dalam domain yang sama, pada host virtual yang sama. Secara bertahap, langkah demi langkah layanan port / halaman / modul ke yii2.

Misalnya, ada situs yang berjalan pada yii1

site.ru/ #  site.ru/news #  site.ru/pages #  site.ru/comments #  

Kami menyalin berita di yii2, menerima:

 site.ru/ #  site.ru/news #  (yii2) site.ru/pages #  site.ru/comments #  

Ulasan yang ditulis ulang, diterima

 site.ru/ #  site.ru/news #  (yii2) site.ru/pages #  site.ru/comments #  (yii2) 

Dan secara bertahap, halaman demi halaman, sampai kita menulis ulang semua yang ingin kita tulis ulang. Jelas bahwa semakin kita menulis ulang, semakin mudah prosesnya. Yang paling sulit adalah selalu langkah pertama: halaman pertama, modul pertama, layanan pertama.

Bagian Satu Hanya bekerja pada saat bersamaan


Saya akan menambahkan tautologi, tetapi semuanya sangat sederhana. Dalam kasus paling sederhana, simpan kedua cabang (yii1 dan yii2) di ruang kerja yang sama, seperti ini:

 /var/www/site/htdocs/ - DOCUMENT_ROOT   /var/www/site/yii1/ -   yii1 /var/www/site/yii2/ -   yii2 

Atau begitulah
 /var/www/site/public_html/ - DOCUMENT_ROOT   /var/www/site/protected/ -   yii1 /var/www/site/yii2/ -   yii2 

atau lebih
 /var/www/site/ - DOCUMENT_ROOT   /var/www/site/protected/ -   yii1 /var/www/site/yii2/ -   yii2 


Tidak masalah bagaimana memberi nama dan menempatkan direktori. Penting untuk memastikan bahwa kode pada yii1 dan yii2 terletak di dekatnya dan tersedia untuk bekerja dalam satu host virtual. Dan semua keajaiban pekerjaan simultan akan ada di input script index.php dan .htaccess.

Apa kelebihan dari pendekatan ini:


  • Di lingkungan pengembangan Anda, 2 cabang proyek akan segera tersedia. Itu bisa nyaman, karena untuk waktu yang lama Anda harus bekerja dengan mereka pada saat yang sama, bolak-balik.
  • Kedua proyek akan memiliki akses langsung ke DOCUMENT_ROOT, yang penting untuk pekerjaan sederhana dengan statika css / js.

Kontra dapat bersifat estetika (berdasarkan jenis: apa yang menjadi penghalang untuk ikut campur bersama), dan terkait dengan pekerjaan multi-pengguna. Ya, Anda dapat membagi lokasi penyimpanan kode dan membagi proyek dalam lingkungan pengembangan. Ini tidak mengubah esensi, cukup tambahkan nuansa.

Secara pribadi, saya membuat proyek terpisah untuk cabang yii2 di IDE, bahkan ketika file cabang secara fisik berada di dekatnya.

Contoh dasar. Sumber cabang proyek yii1 / yii2 dalam satu direktori


DOCUMENT_ROOT menggunakan 2 skrip input.

 index.php -  yii1 index_yii2.php -  yii2. 

Dalam struktur file
 htdocs/ htdocs/index.php htdocs/index_yii2.php yii1/ yii2/ 


index.php
Jika Anda tidak mengubah struktur file untuk proyek ke yii1, maka index.php Anda akan tetap tidak berubah.

Sebagai contoh
 <?php /* * -     . *   , ..     yii1 index.php *       . */ $app = Yii::createApplication('WebApplication', $config); $app->run(); ?> 


index_yii2.php

 <?php defined('YII_DEBUG') or define('YII_DEBUG', true); defined('YII_ENV') or define('YII_ENV', 'dev'); //     yii2  index_yii2.php, //      «». $path = '/../yii2/'; require(__DIR__ . $path.'vendor/autoload.php'); require(__DIR__ . $path.'vendor/yiisoft/yii2/Yii.php'); require(__DIR__ . $path.'common/config/bootstrap.php'); require(__DIR__ . $path.'frontend/config/bootstrap.php'); $config = yii\helpers\ArrayHelper::merge( require(__DIR__ . $path.'common/config/main.php'), require(__DIR__ . $path.'common/config/main-local.php'), require(__DIR__ . $path.'frontend/config/main.php'), require(__DIR__ . $path.'frontend/config/main-local.php') ); (new yii\web\Application($config))->run();?> 


.htaccess
Di .htaccess kita akan melakukan routing antara yii1 dan yii2

 Options +FollowSymlinks RewriteEngine On RewriteBase / #    yii2 # #   RewriteRule ^test index_yii2.php [L] RewriteRule ^news index_yii2.php [L] #   action RewriteRule ^page/one index_yii2.php [L] #       RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d #     yii1 RewriteRule . index.php 

Yaitu URL berikut ditangani oleh index_yii2.php dan dijalankan pada yii2.

 https://site/test https://site/news https://site/page/one 

Situs lainnya adalah index.php (yii1).

Ini adalah peluncuran bersamaan dasar. Tentu saja, masing-masing akan memiliki nuansa tersendiri: tim, pengguna, hak akses, server, repositori berbeda, dll. Dan setiap orang akan memiliki kebun mereka sendiri.

Kode sumber cabang yii1 / yii2 didistribusikan dalam direktori


Misalnya, jika Anda memiliki server sendiri, maka Anda dapat memposting penyimpanan cabang proyek ke direktori yang berbeda.

 /var/www/site/htdocs - DOCUMENT_ROOT    site.ru /var/www/site/protected -   yii1 /srv/site_yii2 -   yii2 

Maka Anda perlu mengubah path ke direktori dengan proyek yii2 di index_yii2.php. Tentu saja, ini akan berfungsi jika dinonaktifkan, atau open_basedir dikonfigurasi. Ditambah hak terkait di server dan dinonaktifkan / dikonfigurasi, SELinux.

index_yii2.php
 <?php defined('YII_DEBUG') or define('YII_DEBUG', true); defined('YII_ENV') or define('YII_ENV', 'dev'); $pathYii2 = '/srv/site_yii2/'; require $pathYii2 . 'vendor/autoload.php'; require $pathYii2 . 'vendor/yiisoft/yii2/Yii.php'; require $pathYii2 . 'common/config/bootstrap.php'; require $pathYii2 . 'frontend/config/bootstrap.php'; $config = yii\helpers\ArrayHelper::merge( require $pathYii2 . 'common/config/main.php', require $pathYii2 . 'common/config/main-local.php', require $pathYii2 . 'frontend /config/main.php', require $pathYii2 . 'frontend /config/main-local.php' ); (new yii\web\Application($config))->run();?> 



Apa selanjutnya


Jika ada pengguna di situs, maka otorisasi tunggal adalah elemen penting yang tanpanya operasi simultan dari 2 cabang, pada kenyataannya, tidak mungkin. Pada artikel berikutnya saya berencana untuk menunjukkan betapa mudahnya mengatur satu otorisasi. Misalnya, otorisasi itu sendiri tetap di yii1, tetapi pengguna yang berwenang secara transparan terlihat di cabang yii2 atau sebaliknya.

Source: https://habr.com/ru/post/id417677/


All Articles