tôi muốn sử dụng Rector để tái cấu trúc mã của mình vì tôi đã cập nhật dự án của mình lên symfony 5. 4 đến 6. 1. Phiên bản dự án php của tôi. số 8. 1. 5
Vì vậy, tôi muốn sử dụng một quy tắc đơn giản để thay đổi chú thích của mình thành thuộc tính với hiệu trưởng. nhưng khi tôi thực hiện hiệu trưởng với lệnh. quy trình nhà cung cấp/bin/hiệu trưởng src
Hiệu trưởng thông báo cho tôi. [OK] Hiệu trưởng đã xong
Nhưng tệp của tôi không thay đổi, chú thích thực thể của tôi không thay đổi. tôi cố gắng làm theo tài liệu này để cấu hình hiệu trưởng của tôi. php và sử dụng hiệu trưởng với symfony
Tại thư mục gốc của dự án, bạn có thể thêm một hiệu trưởng. php để thêm cấu hình của Hiệu trưởng. Trong phần tham số bạn có thể thêm phần setParameters với tùy chọn SKIP. Điều này cho phép bạn bỏ qua một số quy tắc cho Hiệu trưởng trong dự án của bạn. Xem cấu hình bên dưới
Tại Hiệu trưởng 0. 12. 16, `TypedPropertyRector` có thể định cấu hình để cho phép thay đổi được bảo vệ và sửa đổi công khai cũng như xa khi có thể với cấu hình mới
$services->set[TypedPropertyRector::class] ->configure[[ TypedPropertyRector::INLINE_PUBLIC => true, ]];
Bài viết này có hiệu lực đối với Hiệu trưởng parameters[];$parameters->set[Option. ĐƯỜNG, [__DIR__. '/src']];$containerConfigurator->import[LevelSetList. UP_TO_PHP_74];};
Nếu bạn xem lại tài liệu, bạn sẽ thấy một liên kết đến kho lưu trữ Symfony nơi nó cho bạn biết về một loạt các "quy tắc" của Symfony - từ ưa thích của "nâng cấp" - mà họ đã chuẩn bị sẵn. Đó là tốt đẹp của họ
Mẹo
Cấu hình trên trang này bây giờ sẽ trông khác so với trong video. Nhưng, nó vẫn hoạt động như cũ. Sao chép phiên bản mới nhất vào ứng dụng của bạn
Dưới đây, sao chép bên trong chức năng gọi lại của họ. và dán nó lên những gì chúng ta có
dòng 1 - 7use Rector\Symfony\Set\SymfonySetList;use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;. dòng 10 trả về hàm tĩnh [ContainerConfigurator $containerConfigurator]. void {$parameters = $containerConfigurator->parameters[];$parameters->set[Option. SYMFONY_CONTAINER_XML_PATH_PARAMETER,__DIR__. '/var/cache/dev/App_KernelDevDebugContainer. xml'];$containerConfigurator->import[SymfonySetList. SYMFONY_52];$containerConfigurator->import[SymfonySetList. SYMFONY_CODE_QUALITY];$containerConfigurator->import[SymfonySetList. SYMFONY_CONSTRUCTOR_INJECTION];};
Điều này trỏ Hiệu trưởng đến một tệp bộ nhớ cache giúp nó thực hiện công việc của mình. và quan trọng nhất, nó nói với Hiệu trưởng rằng chúng tôi muốn nâng cấp mã của mình lên Symfony 5. 2 tương thích, cũng như nâng cấp mã của chúng tôi lên một số tiêu chuẩn chất lượng mã Symfony và chèn "hàm tạo". Nếu bạn muốn biết thêm về những gì chúng làm, bạn có thể theo dõi các hằng số để kiểm tra mã
Nhưng khoan đã, chúng tôi không muốn nâng cấp mã của mình lên Symfony 5. 2. Chúng tôi muốn nâng cấp hoàn toàn lên Symfony 5. 4. Bạn có thể mong đợi tôi chỉ đặt "54" ở đây. Và chúng ta có thể làm điều đó. Nhưng thay vào đó, tôi sẽ sử dụng
namespace Lib; class SomeClass { public int $a; protected string $b; private bool $c; }9. Ồ. có vẻ như tôi cũng cần thêm một câu lệnh
namespace Lib; class SomeClass { protected string $b; }0 cho
namespace Lib; class SomeClass { protected string $b; }1. Để tôi gõ lại, nhấn "tab" và. tuyệt vời
dòng 1 - 7sử dụng Rector\Symfony\Set\SymfonyLevelSetList; sử dụng Rector\Symfony\Set\SymfonySetList;. dòng 10 - 11trả về hàm tĩnh [ContainerConfigurator $containerConfigurator]. khoảng trống {. dòng 13 - 20$containerConfigurator->import[SymfonyLevelSetList. UP_TO_SYMFONY_54];. dòng 22 - 23};
Dù sao đi nữa. Chúng tôi cần nâng cấp mã của mình từ 5. 0 đến 5. 1. rồi 5. 1 đến 5. 2. và cứ như vậy cho đến Symfony 5. 4. Đó là ý nghĩa của
namespace Lib; class SomeClass { protected string $b; }2. nó sẽ bao gồm tất cả các "quy tắc" để nâng cấp mã của chúng tôi lên 5. 1, 5. 2, 5. 3 và cuối cùng là 5. 4
Và. đó là nó. Chúng tôi đã sẵn sàng để chạy cái này. Nhưng trước khi chúng tôi thực hiện, tôi tò mò không biết điều này sẽ tạo ra những thay đổi gì. Vì vậy, hãy thêm tất cả các thay đổi vào git. và cam kết. Hoàn hảo
Để điều hành Hiệu trưởng, hãy nói
namespace Lib; class SomeClass { protected string $b; }3. Chúng tôi cũng có thể chỉ ra điều này tại các thư mục
namespace Lib; class SomeClass { protected string $b; }4 hoặc
namespace Lib; class SomeClass { protected string $b; }5. nhưng phần lớn những thay đổi nó sẽ áp dụng cho các lớp học của chúng tôi trong
namespace Lib; class SomeClass { /** @var int */ public $a; /** @var string */ protected $b; /** @var bool */ private $c; }60
namespace Lib; class SomeClass { /** @var int */ public $a; /** @var string */ protected $b; /** @var bool */ private $c; }6
Và. nó đang hoạt động. Thật tuyệt vời. Tám tập tin đã được thay đổi bởi Hiệu trưởng. Hãy cuộn lên trên cùng. cái này hay đấy. nó hiển thị cho bạn tệp đã được thay đổi, thay đổi thực tế và bên dưới, quy tắc nào gây ra thay đổi đó
Một sửa đổi mà nó đã thực hiện là
namespace Lib; class SomeClass { /** @var int */ public $a; /** @var string */ protected $b; /** @var bool */ private $c; }61 thành
namespace Lib; class SomeClass { /** @var int */ public $a; /** @var string */ protected $b; /** @var bool */ private $c; }62. Đó là một sự thay đổi tốt. giao diện cũ không được dùng nữa để thay thế cho giao diện mới. Nó cũng thay đổi
namespace Lib; class SomeClass { /** @var int */ public $a; /** @var string */ protected $b; /** @var bool */ private $c; }63 thành
namespace Lib; class SomeClass { /** @var int */ public $a; /** @var string */ protected $b; /** @var bool */ private $c; }64. Một bản cập nhật cấp thấp, tốt khác cho một số mã không dùng nữa
Cũng có một sự thay đổi đối với một lớp học trong
namespace Lib; class SomeClass { /** @var int */ public $a; /** @var string */ protected $b; /** @var bool */ private $c; }65. và một số thứ tương tự khác. Gần phía dưới, danh sách bộ chất lượng mã Symfony đã thêm loại trả về
namespace Lib; class SomeClass { /** @var int */ public $a; /** @var string */ protected $b; /** @var bool */ private $c; }66 cho mọi bộ điều khiển. đó là tùy chọn. nhưng tốt đẹp
Vì vậy, nó không tạo ra nhiều thay đổi, nhưng nó đã khắc phục một số lỗi không dùng nữa mà chúng tôi không cần phải làm gì cả
Tuy nhiên. nó không hoàn hảo. Một vấn đề là, đôi khi, Hiệu trưởng sẽ gây rối với phong cách viết mã của bạn. Đó là bởi vì hiệu trưởng không thực sự hiểu phong cách mã hóa của bạn là gì. và vì vậy nó thậm chí không thử. Nhưng đó là do thiết kế và sẽ dễ dàng sửa chữa
Thứ hai, trong khi nó đã thay đổi giao diện từ
namespace Lib; class SomeClass { /** @var int */ public $a; /** @var string */ protected $b; /** @var bool */ private $c; }61 thành
namespace Lib; class SomeClass { /** @var int */ public $a; /** @var string */ protected $b; /** @var bool */ private $c; }62, nó đã đặt tên toàn bộ lớp. thay vì thêm một câu lệnh
namespace Lib; class SomeClass { protected string $b; }0
dòng 1 - 11use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;. dòng 13 - 24class LoginFormAuthenticator extends AbstractFormLoginAuthenticator implements PasswordAuthenticatedInterface{. dòng 27 - 36hàm công khai __construct[SessionInterface $session, EntityManagerInterface $entityManager, UrlGeneratorInterface $urlGenerator, CsrfTokenManagerInterface $csrfTokenManager, \Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface $passwordEncoder]{. dòng 39 - 43}. dòng 45 - 119}
Và thứ ba, nó không thay đổi bất kỳ tên biến nào. Vì vậy, mặc dù nó đã thay đổi đối số này thành
namespace Lib; class SomeClass { /** @var int */ public $a; /** @var string */ protected $b; /** @var bool */ private $c; }62, nhưng đối số vẫn được gọi là
namespace Lib; class SomeClass { public int $a; protected string $b; private bool $c; }81. cùng với tài sản. Tệ hơn nữa,
namespace Lib; class SomeClass { /** @var int */ public $a; /** @var string */ protected $b; /** @var bool */ private $c; }62 có một phương pháp khác trên đó. và nó không cập nhật mã ở đây để sử dụng tên phương thức mới đó
dòng 1 - 24class LoginFormAuthenticator mở rộng AbstractFormLoginAuthenticator thực hiện PasswordAuthenticatedInterface{. dòng 27 - 34 private $passwordEncoder;. dòng 36hàm công khai __construct[SessionInterface $session, EntityManagerInterface $entityManager, UrlGeneratorInterface $urlGenerator, CsrfTokenManagerInterface $csrfTokenManager, \Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface $passwordEncoder]{. dòng 39 - 42$this->passwordEncoder = $passwordEncoder;}. dòng 45 - 119}
Vì vậy, Hiệu trưởng là một điểm khởi đầu tuyệt vời để nắm bắt một loạt các thay đổi. Nhưng chúng ta sẽ cần lấy những gì chúng ta đã tìm thấy và hoàn thành công việc. Hãy làm điều đó tiếp theo. Chúng tôi sẽ làm một phần của điều đó bằng tay. nhưng rất nhiều tự động với PHP CS Fixer