Лучшая практика для интеграции VueJS с CakePHP 3 - PullRequest
0 голосов
/ 31 мая 2018

Я хотел бы знать, как лучше интегрировать инфраструктуру Vue.js в приложение CakePHP 3?

Я надеюсь, что есть способ воспользоваться всеми инструментами, поставляемыми с VueCLI (webpack и т. д.), все еще работая без необходимости копировать сгенерированный файл в приложение CakePHP

Итак, каков наиболее упрощенный процесс разработки приложения с использованием CakePHP 3 в качестве внутреннего интерфейса и Vue.js в качестве внешнего интерфейса внутри одного проекта.

Большое спасибо!

Ответы [ 3 ]

0 голосов
/ 29 июня 2018

Хорошо, вот быстрая настройка:

1) установить vuejs в подкаталоге webroot (например, webroot / vuedev)

2) настроить маршрутизатор vue для использования режима истории:

export default new Router({
  mode:'history',
  routes: [

3) Измените assetsPublicPath зоны сборки на assetsPublicPath: '', в webroot / vuedev / config / index.js

4) Потому что в режиме разработки ваше приложение работает localhost: 8080 и ваш ajax-вызов your-domain.dev у вас будут проблемы с CORS.Добавьте заголовок к вашим вызовам ajax:

axios.get(url,{headers: {"Access-Control-Allow-Origin": "*"}}).then...

используйте префикс "api" для ваших вызовов ajax: your-domain.xxx/api/controller/action...

5) Изменитьмаршрутизация cakePHP для использования REST api: в config / rout.php:

// add api prefix

Router::prefix('api', function ($routes) {
    $routes->fallbacks(DashedRoute::class);
});

// change default route :

Router::scope('/', function (RouteBuilder $routes) {

    $routes->connect('/:page',['controller'=>'Pages','action'=>'display']); 

    $routes->connect('/', ['controller' => 'Pages', 'action' => 'display', 'home']);
    $routes->connect('/pages/*', ['controller' => 'Pages', 'action' => 'display']);
    $routes->fallbacks(DashedRoute::class);
});

Ajax вызывает your-domain.xxx / api / controller / action будет продолжаться в обычном режиме.Каждые вызовы your-domain.com / xxx будут передаваться на страницы контроллера, показ действий.

6) Скопируйте содержимое index.html вашего webroot / vuedev в свой шаблон дома(src / Template / Pages / home.ctp) и добавьте к вашему дисплею действие вашего контроллера.

$this->viewBuilder()->setLayout(false); 

7) Для производства: Запустите процесс сборки:

npm run build. 

Копироватьwebroot / vuedev / dist / static to webroot / static

Скопируйте содержимое файла webroot / vuedev / dist / index.html в ваш файл src / Template / Pages / home.ctp

Если кто-то позвонитВручную определенную страницу или обновите браузер (то есть: your-domain.xxx/Products), ваш контроллер страниц будет отправлять содержимое index.html.Вы можете добавить te param: page к вашему шаблону / Pages / home.ctp в глобальную переменную тега script, которая будет использоваться маршрутизатором:

<script>var routeToJump=<?php echo $yourvar;?>; </script>

И в вашем App.vue:

export default {
  name: 'App',
  created() {
    this.$router.push(routeToJump);
    ...
0 голосов
/ 08 марта 2019

Вот шаги, которые я выполнил:

  1. Создание проекта с использованием vuejs внутри основного каталога приложения.

  2. Добавление плагинов, таких как vue router, vuex и т. д.

    vue create bos-vue
    vue add vuex
    vue add router
    
  3. Вы можете запустить приложение с помощью следующей команды:

    npm run serve

  4. Установитьузлы, необходимые для проекта:

    npm install --save axios vue-axios

  5. Все данные с сервера cakephp будут получены через запрос axios вформат json.

    axios.get(http://localhost/cakeapp/articles/getdata)

  6. Вышеуказанный вызов вызовет проблему CORS.Для решения проблемы CORS в разработке:

Добавить заголовки в .htaccess, Включить модуль заголовков apache, Отключить промежуточное ПО CSRF в application.php

Для аутентификации запросите у сервера CakePHP логин и сохраните пользовательскую информацию в локальном хранилище (для дальнейшего использования в веб-интерфейсе).Используйте средства навигации для проверки наличия сеанса в каждом ответе на вызов axios.

Для развертывания выполните: npm run build

Скопируйте все (кромеindex.html) из каталога dist в webroot.Скопируйте index.html в default.ctp

Теперь все будет работать в cakephp как обычно.

0 голосов
/ 02 июня 2018

Вы не уйдете без копирования файлов, за исключением случаев, когда вам не нужны размер и время загрузки.Просто добавьте все в ваш webroot / js, затем загрузите все необходимые файлы в ваши представления, и все в порядке.Vue - это JS, просто JS, больше ничего.Также я не понимаю, почему копирование, которое происходит автоматически, является плохим.

IMO-приложения - это огромный беспорядок, каким-то образом склеенный сценариями сборки.

Если вам нужна оптимизированная сборкаиспользуйте npm и webpack и настройте Webpack для создания приложения Vue и определения вашего webroot в качестве целевой папки.Webpack позволяет вам автоматически разделять файлы и выдает предупреждение, когда размер файла становится большим.

Мы поместили весь наш интерфейс в файлы / resources / js и / scss ии так далее, и включите горячую перезагрузку, чтобы мы могли видеть изменения сразу после нажатия кнопки сохранения.Это только для развития.При развертывании на наших живых системах JS строится на реальной системе, мы не добавляем никаких сборок в наш репозиторий git.

Однако "сборка" приложений JS для внешнего интерфейса - это боль взадница, если вы не придерживаетесь 100% чистого приложения JS.Нет реального стандартного способа сделать это.Даже «импорт» имеет свои причуды и выглядит скорее как хак, чем как хорошее решение проблемы, так и не решает проблему упаковки файлов для уменьшения запросов и размера файла.

Как только вы получили все дерьмосклеенные вместе, это обычно работает хорошо, но очень печально, что в 2018 году не было рекомендованного стандарта для создания JS для веб-приложений.Я действительно надеюсь, что то, как все будет сделано сегодня, скоро умрет в пользу Web Assembly.

Если вы не хотите использовать Webpack, есть также require.js и другие, но для нас webpack сработаллучший.

...