Маршруты Laravel с несколькими слагами не будут работать в React - PullRequest
0 голосов
/ 08 февраля 2019

У меня есть приложение с интерфейсом Laravel back-end / React.js.Я использую реагирующий маршрутизатор, поэтому для его работы у меня есть любой путь, указывающий на контроллер, который загружает представление с компонентами в них.Однако, когда я добавляю вложенные маршруты на стороне реакции, то есть «blog /: blogId», кажется, что он полностью пропускает тег, в который загружаются компоненты, и вместо этого показывает содержимое из представления Laravel.

Первоначально яимел:

`Route::get('/{slug?}', 'ProjectsController@index'`

Я пробовал:

`Route::any('{path}', function($path){
    $projects = Project::all();
    $posts = Post::all();
    return view('welcome', compact('projects', 'posts'));
})->where('path', '.*');`

Это тоже не сработает:

`Route::get('/{slug?}/{id?}', 'ProjectsController@index'`

То, что я хочу, для обоих /blogи / blog/2 чтобы перейти к ProjectsController@index, который загружает представление с тегом реагирования.

Данные в моей индексной функции в ProjectsController:

  `$projects = Project::all();
    $posts = Post::all();

    //return $projects;
    return view('welcome', compact('projects', 'posts'));`

Кто-нибудь сталкивался с этимдо?Спасибо.

ОБНОВЛЕНО:

Приветственное представление, возвращаемое методом индекса контроллера:

В <div id="content"></div> находится мой базовый компонентзагружен в.Таким образом, при переходе к маршруту «/ blog» я вижу свой компонент, при переходе к «/ blog / что-либо» я вижу логин и регистрационные ссылки Laravel.

`@extends('layout')

@section('content')

    @if (Route::has('login'))
        <div class="top-right links">
            @if (Auth::check())
                <a href="{{ url('/home') }}">Home</a>
            @else
                <a href="{{ url('/login') }}">Login</a>
                <a href="{{ url('/register') }}">Register</a>
            @endif
        </div>
    @endif

<div id="content"></div>

@include('partials._scripts')

@endsection`

Компонент, использующий ссылку:

`<a href={`/blog/${item.id}`} target="_blank">View here</a>

                    <Route path="/blog/:blogId" component={Post} />`

Мои другие маршруты в базовом компоненте:

`<Switch>
<Route exact path="/" render={(props)=> <Home text={text} mobileNavIsOpen={hamburgerOpen} backgroundImage={background}/>} />
<Route path="/projects" component={Projects} />
<Route path="/blog" component={Blog} />
<Route component={NotFound} />
</Switch>`

Я пытался разместить маршрут / blog /: blogId в базовом приложении вместе с другими - все равно без разницы.

ОБНОВЛЕНИЕ:

При удалении тега / blog / route из маршрутизатора реагирования и сохранении / blog /: blogId это имеет тот же эффект.

ОБНОВЛЕНИЕ / ЧАСТИЧНО РЕШЕНО:

Добавление (\\d+) в мой путь реагирующего маршрутизатора: путь = {/blog/:id(\\d+)} правильно перенес меня во вложенный компонент.Тем не менее, он также загружал содержимое блэйд-представления, поэтому в качестве временного исправления я удалил отображаемый контент блэйдов.Было бы хорошо видеть, есть ли у кого-то другой способ обойти это.Спасибо.

1 Ответ

0 голосов
/ 08 февраля 2019

Попробуйте это Route :: get ('/ {any}', 'ProjectController @ index') -> где ('any', '. *');Это в основном добавляется в конец route / web.php, поскольку, скорее всего, вы пытаетесь создать SPA и хотите, чтобы все http-запросы обрабатывались реагирующим маршрутизатором.

Обновление: на основе ваших обновленийЯ понимаю, что вы хотите, чтобы / blog и / blog /: ID обрабатывались одним и тем же методом.Это можно сделать следующим образом: Route :: get ('blog / {id?}', 'ProjectController @ index') -> where ('id', '[0-9] +');Если вам нужен идентификатор в методе index, укажите его в качестве первого аргумента метода и отправьте его в представление.

...