laravel render view z innego kontrollera

0

Witam. mam nastepujacy problem mam kontroller VideoCommentsController i w nim

  public function showVideoComments($video_id)
    {
        $video = Video::all()->find($video_id);
        $comments = $video->comment()->get();
        return view('videos.detail')->with('comments',$comments);

    }

i Kontroller Videos Controller

 public function detail($video_id)
    {
        $video = Video::all()->find($video_id);
        return view('videos.detail')->with('video',$video);
    }

Do obu kontrollerow jeden kod widoku

 @extends('base')

@section('pageContent')
    <div class="col-xs-12 videos-header card">
        <h2>{{$video->title}}</h2>
    </div>

    <div class="row">

        <!-- left col. -->
        <div class="col-xs-12 col-md-9 single-video-left">

            <div class="card">

                <div class="embed-responsive embed-responsive-16by9">
                    <iframe class="embed-responsive-item" src="{{$video->url}}" frameborder="0" allowfullscreen></iframe>
                </div>

                <div class="single-video-content">
                    {{--<div class="categories">--}}
                        {{--<h4>Kategorie</h4>--}}
                        {{--<span>--}}
                    {{--<a href="">Webdesign</a>,&nbsp;--}}
                    {{--<a href="">PHP</a>,&nbsp;--}}
                    {{--<a href="">Angular</a>--}}
                    {{--</span>--}}
                    {{--</div>--}}
                    <h4>{{$video->title}}</h4>
                    <p>{{$video->description}}</p>
                    <span class="upper-label">Dodał</span>
                    <span class="video-author">{{$video->user->name}}</span>
                    @if(Auth::check())
                    <div class="edit-button">
                        <button class="btn btn-primary btn-lg" onclick="window.location='{{url("/video/edit/$video->id")}}'">
                            Edit Video
                        </button>
                    </div>

                        <div class="edit-button">
                            <button class="btn btn-primary btn-lg" onclick="window.location='{{url("/video/delete/$video->id")}}'">
                                Delete Video
                            </button>
                        </div>
                        @else <div></div>
                    @endif

                </div>

            </div>

        </div>

        <!-- right col. -->
        <div class="col-xs-12 col-md-3 single-video-right">

            @foreach($comments as $comment)
              {{$comment}}
           @endforeach
        </div>
@endsection

i mam nastepujacy problem z bledem undefined variable comments nie wiem dlaczego jezeli przekazuje z 2 kontrollera zmienna do widoku to on go nie widzi czy ktos mogl by wytlumaczyc mi moj blad?

0

Dodam jeszcze ze wiem ze moge zrobic jedna metode w VideosController i tam przekazywac komentarze chce tylko wiedzie dlaczego z innego kontrollera nie moge tego zrobic

0

O ile dobrze rozumiem, próbujesz z dwóch kontrolerów zwrócić widok - to nie działa tak jak myślisz. Gdy zapytanie trafia z routera do odpowiedniego kontrolera (którego zdefiniujesz w routerze), zwrócenie widoku zwraca odpowiedź do użytkownika i nie robi nic więcej.

Musisz to zrobić następująco:

W routerze skieruj zapytanie do VideosController@detail, np:

 Route::get('videos/{video}', 'VideosController@detail');

Następnie w metodzie detail zwróc widok z odpowiednimi parametrami, np:

public function detail(Video $video)
{
    return view('videos.detail')->with([
        'video' => $video,
        'comments' => $video->comment
    ]);
};

Gdy jako parametr metody detail ustawisz objekt Video (Video $video), Laravel sam pobierze z bazy odpowiedni rekord. Następnie zwracamy widok z dwoma parametrami: videos i comments. O ile nie zrobiłeś żadnego błędu w widoku, to wszystko powinno śmigać. Kod wyżej pisałem z palca w okienku odpowiedzi, więc mogłem zgubić jakiś cudzysłów albo nawias:)

Edit: Wydaje mi się, że metoda w modelu Video powinna się nazywać "comments", a nie "comment", bo będzie zwracać wiele komentarzy (a nie jeden, jak wskazuje nazwa).
Edit #2: Gdy chcesz znaleźć rekord mając jego ID, nie rób Video::all()->find($video_id), tylko Video::find($video_id). Gdy pobierasz relację nie rób $video->comment()->get(), tylko $video->comment.

0

Podepnę się do pytania. Rozumiem że metoda wyciągająca rekord videos z bazy musi być w tym kontrolerze, aby laravel wiedział, który rekord pobrać i do którego parametru się odwołać.

0
Nadziany Samiec napisał(a):

Podepnę się do pytania. Rozumiem że metoda wyciągająca rekord videos z bazy musi być w tym kontrolerze, aby laravel wiedział, który rekord pobrać i do którego parametru się odwołać.

Nie musi. Pod tym linkiem masz wyjaśnienie tego co napisałem wyżej - https://laravel.com/docs/5.3/routing#route-model-binding

Możesz również pobrać ten rekord w samym kontrolerze [np. Video::find($id)], ale czemu nie pozwolić Laravel zrobić to za Ciebie? :)

0

@Laran dzieki za odpowiedz mogl bys mi jeszcze powiedziec dlaczego $video->comment()->get() jest niepoprawne?

0

Najlepsze wyjaśnienie znajdziesz w samej dokumentacji - https://laravel.com/docs/5.3/eloquent-relationships#relationship-methods-vs-dynamic-properties

Relacji jako metody [w tym przypadku ->comments() zamiast ->comments] używa się, gdy chcemy zmodyfikować rezultat. Przykład z dokumentacji:

$user = App\User::find(1);

$user->posts()->where('active', 1)->get();

Mam nadzieje, że to pomogło:)

1 użytkowników online, w tym zalogowanych: 0, gości: 1