2012-04-16 30 views
7

Muốn tích hợp một ứng dụng cũ với ứng dụng Symfony 2 - thay thế nhiều phần hơn của ứng dụng cũ bằng các thành phần của Symfony. Cách tiếp cận tôi sẽ sử dụng là sử dụng thùng chứa Symfony 2 trong ứng dụng kế thừa nhận các dịch vụ đã được cấu hình cho ứng dụng Symfony 2. Các dịch vụ đầu tiên tôi muốn sử dụng là phiên làm việc và bối cảnh bảo mật.Cách sử dụng Symfony 2 Container trong ứng dụng cũ

Câu hỏi:

  • Đây có phải là khả thi?
  • Làm cách nào để nhận vùng chứa dịch vụ được định cấu hình?

Thông tin khác trong ứng dụng kế thừa: Mớ hỗn độn PHP điển hình: Các tệp PHP đơn lẻ, như "bộ điều khiển" (kiểm tra $ _GET và $ _POST cho các đường dẫn thực thi khác nhau). Mỗi trang bao gồm init.php để thiết lập tự động tải, kết nối cơ sở dữ liệu, vv .. Quản lý phiên có lớp riêng (mà tôi muốn thay thế), dữ liệu được truy xuất thông qua các cuộc gọi đến phương thức tĩnh (!) Của các đối tượng cơ sở dữ liệu.

+0

Tôi không thể nói nếu nó có thể hay không ... Tất nhiên là vậy, nhưng có đáng không? Để thực hiện các thùng chứa dịch vụ, hãy xem xét bạn sẽ phải thực hiện hạt nhân Symfony2, đó là cốt lõi của khung công tác. – AlterPHP

+0

Nếu không có bất kỳ thông tin nào về cấu trúc của ứng dụng cũ thì không thể trả lời câu hỏi này, ngoại trừ việc nói rằng có thể không có mã OOP không có viết lại chính. – GordonM

+1

Tôi đã làm một cái gì đó như thế này. Tôi sử dụng S2 thường xuyên để có được một hành động điều khiển S2. Từ bộ điều khiển, tôi đã gọi mã khởi tạo kế thừa của mình và sau đó được gọi là bộ điều khiển. Rất nhiều hack nhưng nó hoạt động tốt. Tôi không nghĩ rằng bạn sẽ có nhiều may mắn nhận được một đối tượng phiên S2 được cấu hình đúng cách mà không làm một cái gì đó như thế này. – Cerad

Trả lời

10

Sử dụng DIC của Symfony làm thành phần độc lập is possible nhưng bạn phải làm nhiều việc "theo cách thủ công" (vì bạn không định sử dụng toàn bộ Khung công tác Symfony ngay từ đầu). Có thể bạn sẽ không nhận được nhiều việc sử dụng DIC với tất cả những thứ kế thừa đó.

Nếu bạn muốn đi đường dẫn này, tôi sẽ xem xét việc chọn một thành phần khác trước (như HttpFoundation và HttpKernel).

Vì @Cerad đề xuất bạn có thể bao gồm mã cũ trong Symfony. Có một cái nhìn tại IngewikkeldWrapperBundle bó. Bạn không thể sử dụng nó như là nhưng nó có thể cung cấp cho bạn một số ý tưởng.

Có cách thứ ba.

Bạn có thể quyết định triển khai mọi tính năng mới trong ứng dụng Symfony. Hơn nữa, bạn có thể làm cho cả ứng dụng cũ và Symfony cùng tồn tại. Ở cấp độ máy chủ (ví dụ: Nginx), bạn có thể ủy quyền URL cũ cho ứng dụng cũ và tất cả các URL được di chuyển sang ứng dụng Symfony2. Trong trường hợp của tôi, kịch bản này là lựa chọn tốt nhất và được chứng minh là đang hoạt động. Tuy nhiên, chúng tôi đã cam kết từ bỏ phát triển ứng dụng cũ (vì vậy mọi tính năng mới hoặc thay đổi phải được phát triển trong ứng dụng Symfony2).

Edit: đây là cách bạn có thể khởi động hạt nhân Symfony trong một ứng dụng di sản và gửi một sự kiện (mà là cần thiết cho các bức tường lửa):

$kernel = new \AppKernel('dev', true); 
$kernel->boot(); 

$request = Request::createFromGlobals(); 
$request->attributes->set('is_legacy', true); 
$request->server->set('SCRIPT_FILENAME', 'app.php'); 

$container = $kernel->getContainer(); 
$container->enterScope('request'); 
$container->get('request_stack')->push($request); 
$container->set('request', $request); 

$event = new GetResponseEvent($kernel, $request, HttpKernelInterface::MASTER_REQUEST); 
$eventDispatcher = $container->get('event_dispatcher'); 
$eventDispatcher->dispatch('kernel.request', $event); 
1

Tôi tin rằng bạn có thể truy cập vào dụ container từ ứng dụng di sản của bạn như thế này

$kernel = new AppKernel('prod', true); 
$kernel->loadClassCache(); 
$kernel->boot(); 
$request = Request::createFromGlobals(); 
$container = $kernel->getContainer(); 
$sc = $container->get('security.context'); 
+0

Có, nó hoạt động. Tôi đã thêm một dòng gọi phương thức "khởi động" khởi tạo vùng chứa. Tuy nhiên, tôi vẫn không thể sử dụng security.context vì nó phụ thuộc nhiều vào thiết lập MVC của symfony. – chiborg

+0

Bạn có thể truy cập ngữ cảnh bảo mật như $ container-> get ('security.context') – Sethunath

+0

Có, nhưng tôi đã cố gắng gọi 'getToken' hoặc' isGranted' và nhận một 'AuthenticationCredentialsNotFoundException'. Vì vậy, tôi cho rằng việc sử dụng ngữ cảnh bảo mật sẽ chỉ hoạt động nếu bạn khởi tạo các đối tượng yêu cầu của mình và định tuyến với Symfony - điều mà tôi không thể thực hiện vào lúc này. – chiborg

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