Как передать данные из Laravel в шаблон Blade, а затем в Vue?

Доброго времени суток. 

Я создал сайт на Laravel и в контроллере использовал Blade шаблон для передачи данных в Vue.js через props. 

Вот как выглядит мой шаблон с именем <b>welcome.blade.php</b>:
<pre><code class="html">@extends('layouts.app_n')

@section('content')
    &lt;global-key-hook&gt;&lt;/global-key-hook&gt;
    &lt;flash-message style="position: absolute; top: 5rem; z-index: 100"&gt;&lt;/flash-message&gt;
    &lt;nav-bar-n
        :url="{{$url}}"
        :data="{}"
        :is-auth="{{ $isAuth }}"
        :is-admin="{{ $isAdmin }}"
        :project-info="{{ $project_info }}"
        :auth-user="{{ $auth_user }}"
        :page-menu="{{ $menu }}"
        :get-m-errors="{{ $errors }}"
        :channel="{{ $channel }}"
        :nav="{{$nav}}"
    &gt;&lt;/nav-bar-n&gt;

    &lt;page-welcome&gt;
    &lt;/page-welcome&gt;
@endsection</code></pre>

Во время разработки я предполагал, что в версии production этот код преобразится в один большой файл app.js. Однако после выполнения команды <b>npm run prod</b> я был удивлён, обнаружив, что весь этот шаблон доступен для просмотра в браузере. 

Как мне исправить это, чтобы скрыть шаблон от наружного просмотра?
  • 23 января 2025 г. 9:24
Ответы на вопрос 2
Здравствуйте!

Когда вы используете Blade шаблоны в Laravel, они рендерятся на стороне сервера, и результат отправляется клиенту в виде HTML. Если вы хотите передать данные из Laravel в Vue.js через Blade, то вам необходимо убедиться, что эти данные корректно обрабатываются и не содержат лишней информации, что может привести к утечке данных.

Вот несколько рекомендаций, чтобы скрыть данные от наружного просмотра и сделать вашу архитектуру более безопасной и удобной:

### 1. Минимизируйте данные передаваемые в шаблон

Убедитесь, что передаете только те данные, которые действительно необходимы вашему Vue компоненту. Избегайте передачи конфиденциальных данных (например, пароли).

### 2. Используйте JSON для передачи данных

Для передачи данных между Blade и Vue можно использовать JSON. Это позволит использовать более безопасный и чистый способ передачи данных. Пример передачи данных через JSON:

```blade
<script>
    window.appData = {
        url: @json($url),
        isAuth: @json($isAuth),
        isAdmin: @json($isAdmin),
        projectInfo: @json($project_info),
        authUser: @json($auth_user),
        pageMenu: @json($menu),
        channel: @json($channel),
        nav: @json($nav),
        errors: @json($errors)
    };
</script>
```

В вашем Vue компоненте, вы можете получить данные из `window.appData`:

```javascript
export default {
  data() {
    return {
      url: window.appData.url,
      isAuth: window.appData.isAuth,
      isAdmin: window.appData.isAdmin,
      projectInfo: window.appData.projectInfo,
      authUser: window.appData.authUser,
      pageMenu: window.appData.pageMenu,
      channel: window.appData.channel,
      nav: window.appData.nav,
      errors: window.appData.errors
    };
  }
}
```

### 3. Обфускация (если актуально)

Хотя это не гарантировано, вы можете использовать обфускацию для ваших JavaScript файлов, чтобы затруднить чтение исходного кода. Но помните, что это не предотвращает доступ к данным, которые передаются клиенту.

### 4. Правильная настройка API

Если у вас есть чувствительные данные или функционал, который не должен быть доступен через общие компоненты, рассмотрите возможность создания API с помощью контроллеров Laravel. Vue.js может делать запросы к API для получения данных. Это даст вам более строгий контроль над данными, и повысит безопасность.

### 5. Проверка прав доступа

При передаче данных убедитесь, что вы проверяете права доступа пользователя на сервере, прежде чем отправлять данные. Это особенно важно для конфиденциальной информации.

### Пример использования API:

```javascript
import axios from 'axios';

export default {
  data() {
    return {
      userData: null,
    };
  },
  mounted() {
    axios.get('/api/user-data')
      .then(response => {
        this.userData = response.data;
      })
      .catch(error => {
        console.error(error);
      });
  }
}
```

И создать соответствующий маршрут в Laravel:

```php
Route::get('/api/user-data', [UserController::class, 'getUserData']);
```

В целом, убедитесь, что вы передаете только необходимые данные и следите за безопасностью вашего приложения.
Даже если ты отправишь через ajax ничего не изменится, ответы пользователь все равно увидит. Этот метод передачи пропсов стандартный и давно. 

Ничего проблемного в твоем коде нет. Возможно будет подменить значение isAdmin это вскроет часть интерфейса (смотря на что влияет это) но политики безопасности запросов не дадут выполнить лишние запросы. К тому же пользователь видит только свои данные.

А если ну прям совсем не хочешь показывать - зашифруй! расшифруешь в компоненте, только не понятно зачем.
Похожие вопросы