2016-12-30 9 views
0

Я пытаюсь отобразить Csv данные в массив или что-то в качестве выхода с помощью Zend Framework 2Zend Framework 2 - Как отобразить содержимое файла CSV в контроллере в виде массива

Я создал «привет мир» модуль и вызовы контроллера работают нормально.

CSV File location is data/csv/Foo.csv

Ниже мой Контроллер илит:

public function indexAction() 
{ 
    $filename = 'data/csv/Foo.csv'; 
    $useFirstRecordAsHeader = true; 
    $delimiter = ','; 
    $enclosure = '"'; 
    $escape = '\\'; 
    $this->file = new SplFileObject($filename); 
    $this->file->setFlags(SplFileObject::READ_CSV | SplFileObject::READ_AHEAD | SplFileObject::SKIP_EMPTY | SplFileObject::DROP_NEW_LINE); 

    $this->file->setCsvControl($delimiter, $enclosure, $escape); 

    $this->useFirstRecordAsHeader = $useFirstRecordAsHeader; 

    return $this; 

} 

Но сейчас я получаю сообщение об ошибке:

SplFileObject::__construct(csv/Foo.csv): failed to open stream: No such file or directory

Мой файл CSV находится в той же папке controller/csv/Foo.csv

Так как читать содержимое csv-файла и отображать его как выходной массив или любой другой формат? Я хочу сделать это только с помощью Zend Framework 2.

+0

Попробуйте сохранить csv/Foo.csv в общей папке и повторите попытку. – user3438016

ответ

3

Вы пытаетесь открыть $this->file = new SplFileObject('csv/Foo.csv');, так как вы используя относительный путь, во время выполнения, которое не будет разрешено в папку, в которой находится ваш контроллер (вероятно, она будет разрешена до [yourprojectroot]/csv/Foo.csv).

Если вы действительно хотели сохранить этот файл CSV в controller/csv, вы должны использовать что-то вроде:

$this->file = new SplFileObject(dirname(__FILE__) . '/csv/Foo.csv'); 

Но, экономя, что CSV есть плохо в течение нескольких причин. Сначала вам нужно предоставить разрешение на запись на ваш веб-сервер, чтобы иметь возможность писать в этом каталоге, и вы принципиально испортили бы вашу структуру данных/кода (данные и код не должны находиться вместе, но в легко разделенных силосах).

Лучше создайте папку «данные» и и другую папку «CSV» в каталоге проектов, дать разрешение веб-сервер, чтобы написать там (chmod || chown, other methods), и сделать что-то вроде:

$file = 'data'. DIRECTORY_SEPARATOR . 'csv' . DIRECTORY_SEPARATOR . 'Foo.csv' ; 
$this->file = new SplFileObject($file); 

Помимо этого, Я не уверен, что вы возвращаетесь, на самом деле имеет смысл. Попробуйте что-нибудь вроде:

public function indexAction() 
{ 
    $filename = 'data' . DIRECTORY_SEPARATOR . 'csv' . DIRECTORY_SEPARATOR . 'Foo.csv';; 
    $this->file = new SplFileObject($filename); 
    $this->file->setFlags(SplFileObject::READ_CSV | SplFileObject::READ_AHEAD | SplFileObject::SKIP_EMPTY | SplFileObject::DROP_NEW_LINE); 

    $this->file->setCsvControl(',', '""', '\\'); 
    $this->useFirstRecordAsHeader = true; 

    $response = $this->getResponse(); 
    $headers = $response->getHeaders(); 
    $headers->addHeaderLine('Content-Type', 'text/csv'); 

    $contents = $this->file->fread($this->file->getSize()); 

    $response->setContent($contents); 
    return $response; 
} 
+0

спасибо за ваш ответ, я поставил csv-файл в каталог данных, теперь я догадываюсь, что он открыт, но вещь - я получаю пустой вывод. не получая данные. Я обновил вопрос с обновленным кодом, пожалуйста, помогите мне? –

+0

Что мне нужно для печати, чтобы получить данные csv-файла? –

+0

Это выведет CSV как есть ... «output as array» выглядит странно. Что именно вы хотите достичь? – yivi

2

Вы не должны указывать каталог csv в каталоге Controller, так как он не является контроллером. Это против архитектуры MVC. Хорошей практикой является размещение данных в каталоге data под вашим корневым каталогом на том же уровне, что и ваш каталог module.

Так если у вас есть его на этом data каталоге, вы можете просто написать:

$this->file = new SplFileObject('data/csv/Foo.csv'); 

или лучше (для переносимости):

$filename = 'data'. DIRECTORY_SEPARATOR . 'csv' . DIRECTORY_SEPARATOR . 'Foo.csv' ; 
$this->file = new SplFileObject($filename); 

 Смежные вопросы

  • Нет связанных вопросов^_^