Laravel controllers
Een algemeen project lukt me wel, waar je bijvoorbeeld content kan toevoegen in de database. En het op een andere pagina tonen etc. Dit doe ik simpelweg door een Model, Migration en Controller aan te maken voor een specifieke pagina. Meestal maak ik gebruik van een Resource controller, wat inhoud dat het alle crud opties bevat voor een specifiek database item. Verder vraag ik me af wat de beste manier is om in een controller te werk te gaan als ik bijvoorbeeld meerdere items op een pagina wil tonen. Hiermee bedoel ik bijvoorbeeld dat de gebruiker crud opties heeft voor alle nieuwsberichten op een pagina. Maar ook voor bijvoorbeeld afbeeldingen die op de pagina gelooped worden. Het zijn wel aparte elementen die niks met elkaar te maken hebben. Hopelijk kan iemand me hiermee helpen (uitleggen) wat de beste manier is om verschillende database objecten in 1 controller te verwerken.
Gewijzigd op 08/04/2019 23:55:44 door Jorn Reed
Hier een voorbeeld:
Code (php)
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<?php
//news/show.blade.php content
<h1>{{$news->title}}</h1>
<p>{{$news->content}}</p>
@foreach($news->images as $image)
<img src="{{route('images.show', $image->id)}}" />
@endforeach
?>
//news/show.blade.php content
<h1>{{$news->title}}</h1>
<p>{{$news->content}}</p>
@foreach($news->images as $image)
<img src="{{route('images.show', $image->id)}}" />
@endforeach
?>
Het is een beetje afhankelijk van je code, maar het is hierbij praktisch om je relaties op de modellen te defineren. (Zie: https://laravel.com/docs/5.8/eloquent-relationships )
Dan kun je ze benaderen vanuit je model. Het tonen van de afbeelding is onderdeel van een andere controller, daarvoor kun je dus rustig naar de bijbehorende route linken.
De load is hierbij niet perse nodig omdat het geen versnelling is aangezien je maar 1 model hebt. Wel kun je daarbij er ook voor kiezen om bijvoorbeeld te sorteren, dat is netter om in je controller te doen dan in je view. Je krijgt dan:
zoiets dus:
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<?php
$news = $newsModel->getLatestNewsItems();
$images = $bannerModel->getImages();
return view('news.show', [
'news' => $news,
'images' => $images
]);
?>
$news = $newsModel->getLatestNewsItems();
$images = $bannerModel->getImages();
return view('news.show', [
'news' => $news,
'images' => $images
]);
?>
Ik had zelf al wel aan een structuur gedacht in de html:
Deze entity kun je vervolgens een method geven met een naam als bijv. getType() welke dan gaat bepalen of het een video, afbeelding of text bevat of misschien wel een mix daarvan.
In je view zou je dan iets krijgen als:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
@foreach($newsitems as $newsitem)
...
@if($newsitem->getType() == 'video')
<video width="400" controls>
<source src="{{ $newsitem->getVideoUrl() }}" type="video/mp4">
</video>
@endif
...
@endforeach
...
@if($newsitem->getType() == 'video')
<video width="400" controls>
<source src="{{ $newsitem->getVideoUrl() }}" type="video/mp4">
</video>
@endif
...
@endforeach
Heb je al een keer naar Doctrine ORM gekeken?
Gewijzigd op 14/04/2019 22:18:21 door Frank Nietbelangrijk
Heb ik daarmee gewoon de mogelijkheid om 3 verschillende dingen met 1 soort model in dezelfde database tabel op te kunnen slaan?
Doctrine ORM kan veel zaken voor je regelen.
- Je kunt met een commandline tool een entity aanmaken (welke je later in je editor weer gaat uitbouwen).
- Als je de entity hebt kan Doctrine de database tabel voor je aanmaken of wijzigen al dan niet met migrations
- Doctrine zet de records uit de database automatisch voor je in een entity/entities.
- Doctrine kan zelfs prima met relaties van andere tabellen werken
- Doctrine zet een entity ook zo weg in de database voor je
Toevoeging op 14/04/2019 22:37:47:
Dit artikel lijkt me wel aardig voor je: https://www.sitepoint.com/laravel-doctrine-best-of-both-worlds/