Yii2 + AngularJS

У меня проблема с интеграцией Angular и Yii2 У меня есть 2 части:

  • Обычное приложение Yii2
  • Контроллер, который начинается с actionIndex и работает с Angular

Проблема в том, что когда я копирую и вставляю URL-адрес в Angular, часть я всегда получает ошибку 404. Angular config

.config(function($routeProvider, $locationProvider) {
    base = '/construct/';
    $routeProvider.when(base+':className', {
      templateUrl: '/construct/builder',
      controller: 'BuilderCtrl',
      reloadOnSearch: false
    }).otherwise({
      templateUrl: '/construct/heroes',
      controller: 'HeroesCtrl'
    });

    $locationProvider.html5Mode(true);
  });

Итак, как я могу использовать прямые ссылки в режиме HTML5 для просмотра правильных страниц? Путь вроде "/construct/something" не работает. Мой htaccess:

RewriteEngine on

# If a directory or a file exists, use the request directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# Otherwise forward the request to index.php
RewriteRule . index.php

Ответ 1

Файл

htaccess выглядит корректно, но если у вас есть ваш веб-сервер DocumentRoot и ваш webapp в отдельных папках, вам нужно будет начать с установки пути RewriteBase в вашем файле htaccess примерно так, если вы используете ОС на основе unix:

RewriteEngine on

RewriteBase /~userName/pathToYourYiiProject/web

# If a directory or a file exists, use the request directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# Otherwise forward the request to index.php
RewriteRule . index.php

если вы не получите результаты при входе в путь вручную из своего навигатора, вам нужно будет проверить, активированы ли красивые URL-адреса:

'urlManager' => [
                'class' => 'yii\web\UrlManager',
                'enablePrettyUrl' => true,
                'showScriptName' => false,
            ],

(проверьте ссылку Mihai для официальной документации yii)

проверьте также, будет ли rewrite_module активирован в ваших конфигурациях apache. для включения и загрузки mod_rewrite в ОС Linux вам придется запускать эти сценарии:

$ cat /etc/apache2/mods-available/rewrite.load
$ sudo a2enmod rewrite
$ ls -al /etc/apache2/mods-enabled/rewrite.load

наконец, помните, что последние версии Apache (из 2.3.9) по умолчанию имеют "AllowOverride None", вам придется изменить его на "AllowOverride All" в файле /etc/apache 2/apache2.conf(снова путь в Linux OS dont знать, если это то же самое в другой ОС). перезагрузите сервер Apache и перепрограммируйте вручную путь в навигаторе, если вы получите результаты формата json, тогда ваш back-end работает нормально, и angularJs должен иметь возможность общаться с ним.

Ответ 2

Проблема заключается в том, что ваш WebServer должен обслуживать индексное представление AngularJS для всех путей, начинающихся с /construct/. Вот решение для правила URL в Yii2, которое делает именно это:

В вашем файле config/main.php

'components' => [
    // other components here
    'urlManager' => [
        // other URL Manager settings here
        'rules' => [
            'construct/<path:(.*)>'=>'construct/index',
        ],
    ],
]

В ваших контроллерах /ConstructController.php:

public function actionIndex($path = '/')
{
    // serve your angularJS index page here
}

Ответ 3

Поскольку вы работаете с виртуальным каталогом (например, Alias ​​/site/ "/dir/" ), вы должны использовать

RewriteBase/сайт/ в конфигурационном файле apache.

Ответ 4

Вы включили симпатичные URL-адреса в конфигурации для менеджера URL-адресов? http://www.yiiframework.com/doc-2.0/guide-runtime-routing.html#using-pretty-urls

Angular не имеет ничего общего с этой проблемой, если вы напрямую обращаетесь к URL-адресу и не работаете, то это неправильно с вашей конфигурацией.