Страницы

Поиск по вопросам

четверг, 19 декабря 2019 г.

Yii2 подключение сторонней библиотеки

#php #yii2


Я недавно начал изучать Yii2 и столкнулся с такой задачей:

Есть библиотека PhpWord, мне нужно её подключить, я делаю так в коде приложения

use PhpOffice\PhpWord\PhpWord;
use PhpOffice\PhpWord\Autoloader;


Соответственно библиотека лежит в корне приложения в PhpOffice\PhpWord

Пространства имен класса вроде как совпадают, но почему-то класс не загружается PhpWord.

В чем может быть проблема?
    


Ответы

Ответ 1



Установите класс через composer, тем более есть инструкция как это сделать: https://github.com/PHPOffice/PHPWord

Ответ 2



Как вам и посоветовали проще всего подключить библиотеку через composer (думаю что он у вас еже установлен, но на всякий случай - https://getcomposer.org/doc/00-intro.md), в консоле, перейдите в корень и введите строку composer require "phpoffice/phpword":"dev-master" Но бывают случаи когда не можете или не хотите использовать composer, вы можите подключать свои расширения через конфигурацию - http://www.yiiframework.com/doc-2.0/yii-base-application.html#$extensions-detail То есть вам нужно указать данные вашего расширения в конфигурации (к примеру \config\web.php) в ключе extensions. ... 'components'=>[...], 'params' => $params, 'extensions' => [ 'name' => 'extension name', 'version' => 'version number', 'bootstrap' => 'BootstrapClassName', 'alias' => [ '@alias1' => 'to/path1', '@alias2' => 'to/path2', ], ], ... Тут нужно понимать что данная настройка заменяет основной файл фреймворка для расширений - @vendor/yiisoft/extensions.php, так что вы не сможете использовать composer и свои расширений одновременно. Но это можно обойти, для этого, в папке конфигураций, создайте новый файл (назовем его extensions.php) с кодом: use yii\helpers\ArrayHelper; $extensionsDir = dirname(__DIR__). DIRECTORY_SEPARATOR . 'extensions'; $vendoExtension = require_once dirname(__DIR__).'/vendor/yiisoft/extensions.php'; Yii::setAlias('@extensions', $extensionsDir); $extensions = [ 'extension name'=>[ 'name' => 'extension name', 'version' => 'version number', 'bootstrap' => 'BootstrapClassName', // optional, may also be a configuration array 'alias' => [ '@alias1' => 'to/path1', '@alias2' => 'to/path2', ], ] ]; foreach ($extensions as $extension) { if (isset($extension['alias'])) { foreach ($extension['alias'] as $alias => $path) { Yii::setAlias($alias, $path); } } } $merge = ArrayHelper::merge( $extensions, $vendoExtension ); return $merge; Обратите внимание что в массиве $extensions вы будите указывать свои расширения, по аналогии с файлом @vendor/yiisoft/extensions.php, посмотрите в нем как указываются расширения. Для текущего расширения настройка будет что то вроде этого: 'phpoffice/phpword'=>[ 'name'=>'phpoffice/phpword', 'alias'=>[ '@phpoffice/phpword'=>$extensionsDir . '/phpoffice/phpword', ], ] (код не проверял) Так же я использую отдельную папку для расширений которая установлены без composer (папка extensions в корне), путь к ней указана в переменной $extensionsDir, вы можете указать свою. Остается изменить файл конфигурации (для примера web.php) ... 'extensions' => require_once 'extensions.php', ... Далее заливайте свои расширения в папку указанную в $extensionsDir (в моем случае - extensions в корне), и подключайте их в массиве $extensions . Все это использую в базовом шаблоне, в advanced шаблоне может что либо отличатся. Так же нужно понимать что многие расширения тянут за собой зависимые расширения, которые нужны им для работы, так что вам придется загрузить и подключить их все. Но удобно когда разрабатываешь свое расширение или расширяешь функционал для разового использования.

Ответ 3



Для того чтобы использовать классы вы должны подключить их через require. Для того чтобы не делать это каждый раз был разработан механизм автозагрузки. В случае с yii2 вы используете autoload от composer. Вы можете прописать алиас. Yii::setAlias('@PhpOffice', 'ProjectRoot/PhpOffice'); Лучшим вариантом будет выделить PhpOffice как библиотеку и подключать её через composer как ответил @ShapeShifter08.

Комментариев нет:

Отправить комментарий