@lexstile

Как поменять домен временному URL?

Я бы хотел, чтобы URL был сформирован на другой домен (front-end), как это сделать?
Можно ли переопределить?
Сейчас я даже до конца не понимаю, откуда он берет URL, только в одном месте указано - config/app (api_url):
'api_url' => env('APP_API_URL', 'http://localhost'),

Код:
public function handle($event)
    {

        $user = $event->user;
        $url = URL::temporarySignedRoute(
            'verification.verify',
            Carbon::now()->addMinutes(Config::get('auth.verification.expire', 60)),
            [
                'id' => $user->getKey(),
                'hash' => sha1($user->getEmailForVerification()),
            ]
        );
        Notification::send($user, new \App\Notifications\EmailVerificationNotification($url));
    }
  • Вопрос задан
  • 53 просмотра
Пригласить эксперта
Ответы на вопрос 1
gzhegow
@gzhegow
aka "ОбнимиБизнесмена"
В ларавель конфиг файлы загружаются до старта приложения и только внутри них можно безопасно брать данные из env() (в теории можно везде конечно, но я как-то ловил с этим проблему либо они пропадают, либо глюк какой-то был, года два назад долбался)

то есть сначала ты в папке /config/ создаешь любой файл с расширением myfilename.php который возвращает массив, там хаваешь данные:

# ./.env
APP_API_URL=http://localhost


<?php
// ./config/myfilename.php
return [ 'api_url' => env('APP_API_URL') ];


<?php
// ./src/Commands/MyCommand.php

namespace App\Commands;

class MyCommand {
  public function handle() {
    $apiUrl = config('myfilename.api_url');
  }
}


Иногда руководитель не хочет привязываться к ларавель и требует написать код работающий для любого фреймворка, в этом случае на вход исполняющего класса нужно передать array $configFilename, который потом настроить в AppServiceProvider.php (который по сути просто настройщик контейнера-инжектора):

<?php
// ./src/Providers/AppServiceProvider

namespace App\Providers;

Class AppServiceProvider {
  public function register() {
    $app->when(\App\Commands\MyCommand::class)
      ->needs('$configFilename')
      ->give(function () { return config('filename'); });
  }
}


<?php
// ./src/Commands/MyCommand.php

namespace App\Commands;

class MyCommand {
  protected $configFilename;

  public function __construct(array $configFilename) {
    $this->configFilename = $configFilename;
  }

  public function handle() {
    $apiUrl = $this->configFilename['api_url'];
  }
}


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

Это что касается как прокинуть свою переменную окружения в любое место.

Есть еще вопрос как работает фасад Url и его метод ::temporarySignedUrl(). У каждого фасада есть ->getFacadeAccessor() который возвращает класс, занимающийся работой. Фасад это всего лишь "вызывалка" действий, которая вопреки всем законам ООП решили сделать статической.

Тебе нужно достать оттуда класс в каком-то методе ->handle() (создай себе TestCommand::class), или написать метод ->test() в каком-то из контроллеров (MainController.php или TestController.php), достать акцессор, посмотреть что за класс с помощью dd() или var_dump(get_class()). Потом найди этот класс в папке ./vendor/illuminate и посмотри внутри какую конкретно переменную оно использует. Может быть не APP_API_URL, а просто APP_URL ?

Если просто APP_URL, то надо подумать можно ли тебе её менять. Ведь скорее всего на эту переменную подвязан какой-нибудь Sitemap Generator, и значит нужно наследовать и подменять фасад для Uri, или писать свой класс декоратор, куда на вход будет исполнитель фасада прилетать, а все что он умеет - единственный метод, который делает то же действие по-другому.

Ларавель и архитектура это не друзья. Зато ларавель и короткий синтаксис - это работает.

Способ ларавеля это же сделать чуть другой (я думаю):
в файле routes.php ты своему роуту "verification.verify" в документации роутера на их сайте ищешь как установить домен. При любой попытке его создать он либо как-то будет использовать твой новый указанный домен, либо "попросит" (упадет в ошибку и не будет работать) его передать вместе с "id" и "hash".
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы