2012-01-05 10 views
12

Trong configure() chức năng, tôi đã cố gắng để có được container dịch vụBắt Dịch vụ container tại Symfony 2 Bảng điều khiển lệnh cho "getKernel() trên một tổ chức phi vật thể"

class SetQuotaCommand extends ContainerAwareCommand { 

    protected function configure() { 
     parent::configure(); 
     die(get_class($this->getContainer())); 

PHP Fatal error: Call to a member function getKernel() on a non-object in ...\Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand.php on line 37

Tôi có cần phải làm gì đó khác không?

CẬP NHẬT

tôi nhận thấy rằng nó hoạt động nếu tôi gọi getContainer trong execute(). Nhưng tôi tự hỏi liệu có thể có getContainer() trong số configure() không. Tôi muốn lấy thông số cấu hình để sử dụng trong đối số giá trị mặc định addOption.

Nếu không tôi có thể sử dụng

$param1 = $input->getOption('param1') ? : $container->getParameter('param1'); 

nào xuất hiện của abit hơn un-trực quan?

+0

Tôi nghĩ rằng vấn đề là cách bạn đang thực hiện nó. Thêm một tùy chọn dựa trên giá trị cấu hình không phải là một giải pháp rất tốt. Bạn đang cố gắng đạt được điều gì? –

+0

Tôi muốn đặt các giá trị mặc định trong parameters.ini. Có thể truy cập một số thứ thông qua ứng dụng và bảng điều khiển. Mặc dù vào suy nghĩ thứ hai, có lẽ tôi có thể lấy đi với một mặc định hardcoded ... hmm ... whats sai với cách của tôi làm điều đó mặc dù? –

+0

Tôi xin lỗi, tôi hiểu lầm những gì bạn đang cố gắng đạt được. Không có gì sai với cách làm của bạn. Tôi nghĩ rằng giải pháp duy nhất có thể là đặt giá trị mặc định thành '' 'false''' trong' '' configure() '' 'và sau đó đặt nó theo cách thủ công trong' '' execute() '' '. –

Trả lời

2

Dường như vùng chứa dịch vụ chưa được khởi tạo trong configure. Tôi có thể truy cập nó trong execute.

Đối với giá trị mặc định cho giao diện điều khiển lựa chọn, tôi có thể sử dụng một cái gì đó giống như

$opt1 = $input->getOption('opt1') ? : $default; 

Trong nhiều trường hợp Symfony2 phép bạn thiết lập một giá trị mặc định khi lấy thông số/biến. Vì vậy, một phím tắt cho các giải pháp nêu trên sẽ chỉ đơn giản là:

$opt1 = $input->getOption('opt1', $default); 

Chỉ cần đưa điều này như một câu trả lời để tôi có thể đóng này nếu theres không có câu trả lời khác.

18

Gọi $this->container = $this->getApplication()->getKernel()->getContainer(); khi thực thi(). Xem https://stackoverflow.com/a/7517803/297679

+0

'$ this-> container' có quyền truy cập riêng tư, do đó bạn không thể đặt nó trong một lớp mở rộng – JamesHalsall

2

Mặc dù tất cả thông tin tôi tìm thấy trên Google (bao gồm cả chủ đề này) dường như không có gì hiệu quả. Cuối cùng tôi đã tìm ra lý do tại sao tôi đã không thể có được một hạt nhân.

Trong 1: 1 bản sao từ các tài liệu, tôi đã tạo ra một application.php file:

#!/usr/bin/env php 
<?php 
// application.php 

require __DIR__.'/vendor/autoload.php'; 
require __DIR__.'/app/AppKernel.php'; 

use X\SnmpBundle\Command\GreetCommand; 
use Symfony\Component\Console\Application; 

$application = new Application(); 
$application->add(new GreetCommand()); 
$application->run(); 

Và sau đó thực hiện các ứng dụng bằng cách chạy:

./application.php này: đó hoặc php application.php này: rằng

Điều này không hiệu quả đối với tôi. Đối với một số lý do hạt nhân không có sẵn khi làm điều này. Tuy nhiên, đó là khi tôi chạy các ứng dụng sử dụng:

php ứng dụng/console này: đó

đoán của tôi là chạy ứng dụng app/console hiện rất nhiều hơn sau đó application.php tôi làm, chẳng hạn như bắt đầu một hạt nhân.

Với chạy ứng dụng như "php ứng dụng/console này: rằng" tất cả mọi thứ hoạt động tốt và tôi có thể sử dụng:

$this->getContainer()->get('doctrine')->getManager(); 

đó là những gì tôi cần.