2015-06-26 22 views
14

Các Laravel 5 documentation mô tả hai cách để gán Middleware:Thực hiện theo thứ tự của Middleware trong Laravel 5

  1. Gán middleware để định tuyến của bộ điều khiển.
  2. Chỉ định phần mềm trung gian trong bộ khởi tạo của trình điều khiển của bạn.

Tuy nhiên, tôi nhận ra rằng bất kỳ mã viết bằng các bộ điều khiển __construct() chức năng sẽ chạy trước khi Middleware, ngay cả khi Middleware được khai báo trên dòng đầu tiên của chức năng của bộ điều khiển __construct.

Tôi đã tìm thấy bug report cho một sự cố tương tự trong kho lưu trữ Laravel github. Tuy nhiên, một cộng tác viên đã đóng lại vấn đề nêu rõ "Đây là hành vi mong đợi".

tôi tự hỏi rằng, middleware nên "lớp" bên ngoài ứng dụng, trong khi __construct chức năng là một phần của ứng dụng. Tại sao chức năng __construct được thực hiện trước phần mềm trung gian (trước đây là phần mềm trung gian) và tại sao điều này được mong đợi?

+1

Tôi vừa thực hiện một vài thử nghiệm để xác nhận. Nếu bạn muốn phần mềm trung gian thực thi trước các bộ điều khiển '__construct()', bạn cần gán phần mềm trung gian cho tuyến. Nếu không, nó sẽ luôn luôn được thực hiện ở cuối '__construct()' ngay cả khi được gán trên dòng đầu tiên của 'construct()'. – Jeemusu

+0

Tôi đã tạo một ví dụ nhanh để phác thảo những gì bạn mô tả, vui lòng thêm nó vào câu hỏi của bạn. https://www.notehub.org/2015/6/26/say-we-have-a-controller----welcomecontr – Jeemusu

+0

@Jeemusu Cảm ơn bạn đã bình luận.Yup, tôi cũng phát hiện ra sự khác biệt này giữa hai cách gán phần mềm trung gian. Tuy nhiên, bằng cách đặt các middleware ở phần cuối của dòng chảy thực hiện trong các nhà xây dựng, nó là chống lại Yêu cầu Vòng đời (http://laravel.com/docs/5.1/lifecycle), kể từ khi công văn đề nghị nên có kết thúc? –

Trả lời

7

Logic ứng dụng nằm trong các phương pháp của bộ điều khiển. Vì vậy, cơ bản ứng dụng cuộc sống trong các phương pháp của bộ điều khiển, không phải trong toàn bộ bộ điều khiển chính nó.

Chạy phần mềm trung gian TRƯỚC KHI yêu cầu nhập vào phương pháp điều khiển tương ứng. Và do đó, điều này luôn luôn bên ngoài ứng dụng thực tế. Không có phương thức điều khiển nào được thực hiện trừ khi tất cả các phần tử Middlewares đều chuyển yêu cầu.

Báo cáo $this->middleware("My\Middleware"); mà bạn đặt trong bộ tạo điều khiển, ĐĂNG KÝ My\Middleware để kiểm tra trước khi yêu cầu nhập vào ứng dụng.

Nếu bạn thấy mã của phần mềm trung gian và nếu yêu cầu được chuyển, sau đó chúng tôi gửi mã đó tới phần mềm trung gian tiếp theo bằng cách sử dụng câu hỏi $next($request);. Điều này cho phép nhiều phần tử trung gian được thực hiện cho một yêu cầu duy nhất. Bây giờ, nếu Laravel chạy phần mềm trung gian ngay tại câu lệnh $this->middleware(...);, Laravel có lẽ sẽ không thể biết phần mềm trung gian nào sẽ được kiểm tra tiếp theo.

Vì vậy, Laravel giải quyết điều này bằng cách đăng ký tất cả các phần tử trung gian đầu tiên, sau đó chuyển yêu cầu qua tất cả các phần tử trung gian một.

+2

một trường hợp thú vị với nó này, nơi các middleware chạy trong đối với các nhà xây dựng. Bất kỳ phần mềm trung gian toàn cục nào thực sự có vẻ chạy * trước * constructor, trong khi bất kỳ phần mềm trung gian cục bộ nào chạy sau hàm tạo. Sự mâu thuẫn này đã khiến tôi bối rối và khó khăn trong quá khứ. –

+0

vì vậy những gì chạy đầu tiên gây ra câu trả lời là không rõ ràng đối với tôi tôi mong đợi nó sẽ như sau ** tuyến đường nhóm ** => ** tuyến đường quy định ** (theo lệnh array) sau đó 'khiển construct'. được điều này có đúng –

+0

Tôi cũng đang vẫn bối rối về cách laravel quyết định đó để chạy chúng trong. Có chữ cái? – JohnL

1

Một câu trả lời để trang trải trường hợp sử dụng khác cho câu hỏi đó

Nếu nó liên quan đến trật tự giữa middleware nó tự

Bạn có thể cập nhật $ middlewarePriority tại của bạn App \ Kernel.

Các vấn đề liên quan