Представьте, что Yii2 — это мощный грузовик, который возит данные и управляет логикой на сервере. А фронтенд-фреймворки — это красивые спортивные машины, которые делают интерфейс быстрым и отзывчивым. Как их соединить, чтобы не было хаоса на дороге? В этой статье я расскажу, как интегрировать Yii2 с Vue.js, React и Angular, чтобы всё работало как часы.

Почему стоит интегрировать Yii2 с фронтенд-фреймворками?

Yii2 сам по себе умеет генерировать HTML с помощью виджетов и шаблонизатора. Но современные пользователи привыкли к одностраничным приложениям (SPA), где страницы не перезагружаются, а данные подгружаются на лету. Фронтенд-фреймворки дают:

  • Плавность интерфейса — никаких мерцаний при загрузке.
  • Разделение труда — бэкенд занимается API, фронтенд — отрисовкой.
  • Масштабируемость — можно подключать новые модули без переписывания всего.

Но есть нюанс: Yii2 не предназначен для работы как полноценный REST API из коробки. Его нужно немного настроить.

Настройка Yii2 для работы с API

Первый шаг — превратить Yii2 в поставщика данных. Для этого используем модуль REST API, который встроен в фреймворк. Он позволяет быстро создавать эндпоинты для CRUD-операций.

Пример базового контроллера для работы с моделью User:

namespace app\controllers\api;

use yii\rest\ActiveController;

class UserController extends ActiveController
{
    public $modelClass = 'app\models\User';
}

Теперь нужно настроить маршруты в конфигурации (файл config/web.php):

'urlManager' => [
    'enablePrettyUrl' => true,
    'showScriptName' => false,
    'rules' => [
        ['class' => 'yii\rest\UrlRule', 'controller' => 'api/user'],
    ],
]

После этого по адресу /api/users можно получать список пользователей в формате JSON. Это основа для интеграции с любым фронтендом.

Интеграция с Vue.js: просто и элегантно

Vue.js отлично дружит с Yii2, потому что он не навязывает строгую архитектуру. Можно использовать его как часть шаблона Yii2 или как отдельное SPA.

Самый простой способ — встроить Vue-компоненты прямо в виджеты Yii2. Допустим, у нас есть форма обратной связи. Создаём Vue-компонент:

Vue.component('feedback-form', {
    data: function() {
        return {
            name: '',
            email: '',
            message: ''
        }
    },
    methods: {
        submitForm: function() {
            axios.post('/api/feedback', this.$data)
                .then(function(response) {
                    alert('Спасибо за отзыв!');
                })
                .catch(function(error) {
                    alert('Ошибка: ' + error);
                });
        }
    },
    template: `
        
` });

Затем подключаем этот компонент в шаблоне Yii2:

И не забываем загрузить Vue и Axios через AssetBundle:

class AppAsset extends AssetBundle
{
    public $js = [
        'https://cdn.jsdelivr.net/npm/vue@2',
        'https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js',
        'js/app.js',
    ];
}

Всё работает. Vue отвечает за интерфейс, Yii2 — за обработку данных.

Интеграция с React: мощь и гибкость

React требует более серьёзной настройки. Обычно его используют для создания полноценного SPA, которое полностью отделено от бэкенда. Yii2 в этом случае выступает только как API.

Создаём React-приложение с помощью create-react-app, а затем настраиваем прокси для запросов к Yii2. В файле package.json добавляем:

"proxy": "http://localhost:8080"

Где 8080 — порт, на котором работает Yii2 (например, через встроенный сервер). Теперь все запросы из React на /api будут перенаправляться на Yii2.

Пример React-компонента для списка пользователей:

import React, { useState, useEffect } from 'react';
import axios from 'axios';

function UserList() {
    const [users, setUsers] = useState([]);

    useEffect(() => {
        axios.get('/api/users')
            .then(response => setUsers(response.data))
            .catch(error => console.error(error));
    }, []);

    return (
        
    {users.map(user => (
  • {user.name}
  • ))}
); } export default UserList;

Для работы с формами и аутентификацией используем CSRF-токены. Yii2 передаёт их в куках или в ответе API. В React получаем токен и добавляем в заголовки:

axios.defaults.headers.common['X-CSRF-Token'] = 
    document.querySelector('meta[name="csrf-token"]').getAttribute('content');

Интеграция с Angular: корпоративный подход

Angular — это тяжёлая артиллерия. Он требует чёткой структуры и типизации. Yii2 с ним работает через REST API, как и с React. Но есть особенности: Angular использует HttpClientModule для запросов и Interceptor для обработки ошибок.

Пример сервиса для работы с пользователями:

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs';

@Injectable({
  providedIn: 'root'
})
export class UserService {
  private apiUrl = '/api/users';

  constructor(private http: HttpClient) { }

  getUsers(): Observable {
    return this.http.get(this.apiUrl);
  }

  createUser(user: any): Observable {
    return this.http.post(this.apiUrl, user);
  }
}

В Angular важно настроить CORS на стороне Yii2, если фронтенд работает на другом порту. Для этого создаём фильтр в контроллере:

use yii\filters\Cors;

public function behaviors()
{
    return [
        'corsFilter' => [
            'class' => Cors::className(),
            'cors' => [
                'Origin' => ['http://localhost:4200'],
                'Access-Control-Request-Method' => ['GET', 'POST', 'PUT', 'DELETE'],
                'Access-Control-Allow-Credentials' => true,
            ],
        ],
    ];
}

Без CORS Angular не сможет отправлять запросы, если домены разные.

Правило: Всегда проверяйте настройки CORS на боевом сервере. Не разрешайте доступ со всех доменов — это дыра в безопасности. Лучше явно перечислить разрешённые источники.

Сравнение подходов: что выбрать?

ФреймворкСложность интеграцииПроизводительностьКогда использовать
Vue.jsНизкаяВысокаяНебольшие проекты, быстрый старт
ReactСредняяВысокаяСредние и крупные проекты
AngularВысокаяСредняяКорпоративные приложения, команды

Выбор зависит от ваших задач. Если нужно быстро добавить интерактивность на существующий сайт на Yii2 — берите Vue. Если планируете сложное SPA с большим количеством логики — React или Angular.

Что в итоге?

Интеграция Yii2 с современными фронтенд-фреймворками — это не rocket science. Главное — правильно настроить API, обрабатывать CSRF и CORS, а также не пытаться смешивать логику сервера и клиента. Yii2 отлично справляется с ролью бэкенда, а Vue, React или Angular делают интерфейс удобным. Начните с малого — добавьте один компонент на Vue, а потом расширяйте.

Помните: хороший код — это когда каждая часть делает своё дело.

Студия WNDER — разработка на PHP и не только.