Mục đích của việc mở rộng trong laravel là gì?

Một số vấn đề khi sử dụng khung là bạn bị ràng buộc với những gì công cụ của họ cung cấp và trong một số phần, bạn phải làm mọi thứ theo cách của khung - điều này còn gây tranh cãi, một số khung làm tốt hơn và tệ nhất. Và nếu bạn muốn mở rộng một cái gì đó, bạn sẽ thay đổi giữa hai giải pháp. tạo phương thức hoặc Lớp trợ giúp của riêng bạn ở đâu đó hoặc mở rộng công cụ và ghi đè lên nó khi ứng dụng của bạn khởi động

Tùy chọn cuối cùng, mở rộng một lớp với các phương thức mới của riêng bạn, là một điều rất rắc rối, vì bạn không chỉ yêu cầu khung tải công cụ của mình thay vì mặc định, mà còn phải chú ý đến các bản cập nhật, vì một công cụ mới

Nếu có một cách dễ dàng để thêm phương thức tùy chỉnh của riêng bạn vào Lớp…

…đợi đã. Có. Và được gọi là Macro

Macro là cái quái gì vậy?

Macro, như Laravel gọi chúng, là một cách đưa phương thức có thể gọi của riêng bạn vào một Lớp. Nó đã có từ Laravel 4. 2, vì vậy nó không phải là một cái gì đó mới

Hãy nghĩ về chúng như một loại keo hoặc băng dính cho phép bạn dán một phương thức ở dạng Đóng vào Lớp bạn muốn mà không cần phải sửa đổi trực tiếp — điều hoàn toàn không được khuyến nghị khi lớp đến từ một gói bên ngoài khác — hoặc phải mở rộng . Giống như dán búa vào đèn pin để bạn có thể đóng đinh trong bóng tối mà không cần phải gọi nhà sản xuất để tạo ra chiếc đinh cho bạn. Và nếu bạn mua một mô hình cập nhật mới, băng và đèn pin vẫn có thể hoạt động

Như bạn có thể đoán, Macro là phụ gia. Bạn không thể sử dụng Macro để xóa phương thức hoặc ghi đè hoàn toàn phương thức. Nếu bạn cần ghi đè một phương thức, bạn chết tiệt. mở rộng lớp học và làm những gì bạn phải

Macro không được ghi lại, ngoại trừ trên một số lớp có thể chứng minh là hữu ích như và. Xem xét trường hợp sử dụng, hoàn toàn ổn nếu không ghi lại chúng, nhưng bạn nhất định phải tìm kiếm chúng (sẽ nói thêm về điều đó sau)

Các chức năng là huyền diệu

  • Bạn có thể sử dụng phương thức
    class ToBeMacroable
    {
    use Macroable {
    __call as macroCall,
    }
    // ...
    }
    5 trên Lớp bạn muốn mở rộng hoặc thông qua Mặt tiền của nó, với tên của phương thức mới và
    class ToBeMacroable
    {
    use Macroable {
    __call as macroCall,
    }
    // ...
    }
    6 để bao gồm
  • Phương thức được lưu bên trong một mảng tĩnh
  • Khi bạn gọi Macro mà bạn đã đăng ký trong Lớp, nó sẽ liên kết
    class ToBeMacroable
    {
    use Macroable {
    __call as macroCall,
    }
    // ...
    }
    7 với Đóng mà bạn đã đăng ký và thực thi mã, điều này sẽ phụ thuộc vào việc gọi là tĩnh hay động

Ví dụ: nếu bạn sử dụng

class ToBeMacroable
{
use Macroable {
__call as macroCall,
}
// ...
}
7 bên trong Closure của mình, thì nó sẽ không tham chiếu đến lớp nơi nó được khai báo, mà là lớp bạn đang mở rộng. Nếu bạn đang mở rộng lớp Chế độ xem, thì
class ToBeMacroable
{
use Macroable {
__call as macroCall,
}
// ...
}
7 sẽ chỉ tham chiếu đến trường hợp đó

use \Illuminate\Routing\ResponseFactory;class RandomThing
{
public static function registerMacro()
{
ResponseFactory::macro('whatClassIs', function() {
return get_class($this);
});
}
}
echo response()->whatClassIs();
//
// "\Illuminate\Routing\ResponseFactory".
//

Tất cả những điều này được thực hiện nhờ vào đặc điểm Macroable, bao gồm các phương thức ma thuật

class ToBeMacroable
{
use Macroable {
__call as macroCall,
}
// ...
}
0 và
class ToBeMacroable
{
use Macroable {
__call as macroCall,
}
// ...
}
0 chịu trách nhiệm thực hiện cuộc gọi phương thức của bạn và kết nối nó với Macro mà bạn đã đăng ký

Này, nếu Lớp đã sử dụng phương pháp ma thuật “__call” thì sao?

Một số lớp sử dụng phương pháp ma thuật

class ToBeMacroable
{
use Macroable {
__call as macroCall,
}
// ...
}
1 cho logic riêng của nó. Khi bạn sử dụng một đặc điểm có cùng tên phương thức, phương thức Lớp sẽ được ưu tiên. Như bạn có thể đoán, khi một lớp sử dụng
class ToBeMacroable
{
use Macroable {
__call as macroCall,
}
// ...
}
0, điều này đặt ra một vấn đề vì đặc điểm Macroable sẽ không hoạt động

Giải pháp trong một số lớp là khai báo Macroable, mở dấu ngoặc nhọn và yêu cầu PHP bao gồm phương thức

class ToBeMacroable
{
use Macroable {
__call as macroCall,
}
// ...
}
1 là
class ToBeMacroable
{
use Macroable {
__call as macroCall,
}
// ...
}
4

class ToBeMacroable
{
use Macroable {
__call as macroCall,
}
// ...
}

Sau đó, trong các phương thức

class ToBeMacroable
{
use Macroable {
__call as macroCall,
}
// ...
}
1 bên trong lớp, chúng tôi vui lòng hỏi xem có Macro đã đăng ký chưa và thực thi nó bằng cách sử dụng
class ToBeMacroable
{
use Macroable {
__call as macroCall,
}
// ...
}
4. Ví dụ, để cả hai phương pháp sống hạnh phúc

Các lớp Macroable

Như tôi đã đề cập trước đây, danh sách các lớp Macroable không được ghi lại. Điều tốt nhất bạn có thể làm là truy cập API và tìm kiếm trên

class ToBeMacroable
{
use Macroable {
__call as macroCall,
}
// ...
}
7 trên kho lưu trữ Github hoặc sử dụng IDE của riêng bạn

Cung cấp cho tôi tất cả các Lớp bao gồm Macroable

Làm điều đó sẽ cho phép bạn có một danh sách rõ ràng về những gì Lớp học cho phép mở rộng

Bản thân Laravel có sử dụng Macro không?

Tất nhiên. Hãy lấy mẫu mã cho phép chúng ta sử dụng tiện dụng

class ToBeMacroable
{
use Macroable {
__call as macroCall,
}
// ...
}
8. Nếu bạn xem lớp Yêu cầu, bạn sẽ không thấy phương thức "xác thực" nào. Đoán xem,
class ToBeMacroable
{
use Macroable {
__call as macroCall,
}
// ...
}
9

class ToBeMacroable
{
use Macroable {
__call as macroCall,
}
// ...
}
1

Phương thức macro'ed này kết nối một phiên bản trình xác thực với các quy tắc và đầu vào Yêu cầu. Sau đó chúng ta có thể sử dụng nó mà không cần thêm nhiều dòng mã, gọn gàng

class ToBeMacroable
{
use Macroable {
__call as macroCall,
}
// ...
}
2

Cách tốt nhất để đăng ký Macro là theo bất kỳ Nhà cung cấp dịch vụ nào hợp lý. Ví dụ: nếu tôi muốn đăng ký Macro cho lớp Chế độ xem, tôi sẽ sử dụng

class ToBeMacroable
{
use Macroable {
__call as macroCall,
}
// ...
}
10, nhưng nếu tôi đang đăng ký Macro cho Trình quản lý xác thực, tôi sẽ sử dụng
class ToBeMacroable
{
use Macroable {
__call as macroCall,
}
// ...
}
11

Và đó là tất cả. Không cần phải làm mã spaghetti run rẩy để chỉ cần thêm một số chức năng trong các công cụ khung

Tiện ích mở rộng trong Laravel là gì?

Các thành phần của Laravel thường được mở rộng theo hai cách. ràng buộc các triển khai mới trong vùng chứa IoC hoặc đăng ký tiện ích mở rộng với lớp Người quản lý, là các triển khai của mẫu thiết kế "Nhà máy" .

Làm cách nào để mở rộng lớp trong Laravel?

Trên thực tế, cách thích hợp để mở rộng thư viện sẽ như sau. .
Tạo phản hồi. php trong ứng dụng/thư viện/
Bên trong nó, mở rộng lớp theo cách sau. lớp Phản hồi mở rộng \Laravel\Response
Nhận xét 'Phản hồi' => 'Laravel\\Response' trong ứng dụng/config/ứng dụng. php

Kế thừa trong Laravel là gì?

Mặc dù tính kế thừa là một trong những trụ cột của lập trình hướng đối tượng , nhưng nó thực sự ít có lợi hơn khi được sử dụng cùng với một khung như Laravel. Một trong những nhược điểm là bạn tạo một lớp ngăn cách giữa mã của bạn và Laravel. Trớ trêu thay, sự tách biệt này thường là động lực để sử dụng quyền thừa kế.

Năng suất trong Laravel là gì?

Trong Laravel, @yield chủ yếu được sử dụng để xác định một phần trong bố cục và được sử dụng liên tục để tải nội dung từ trang con đến trang chính.