Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [inny][Laravel 5]Routes from DataBase
Forum PHP.pl > Forum > PHP > Frameworki
Randallmaster
Cześć,

Czy w Laravel'u można stworzyć tak routes abym nie musiał wypisywać wszystkich stron po kolei tylko aby były one pobierane z bazy danych?

Przykładowo oprogramowanie ma 100 stron, to w takim przypadku musiałbym wypisać 100 razy:

Route::get(…..
ctom
Kod
Route::get('/{slug}', function($slug){
    // 'slug' to indentyfikator strony w Twojej bazie
});
Randallmaster
jest gdzieś dokumentacja użytkowania {slug}, na pierwszy rzut oka za dużo nie ma, może mógłbyś coś polecić? na Laravel i Laracasts tylko na forum trochę opisują, w dokumentacji chyba nie ma
Pyton_000
Ale co Ty chcesz opisywać?

Wrzucasz takiego route jako ostatni i kierujesz na jakiś kontroler. Tam wyszukujesz w bazie to co dostaniesz w parametrze i jak jest to wyświetlasz coś tam.
Randallmaster
ok wykonałem takie coś:

  1. Route::get('/{slug}', function($slug){
  2. dd($slug);
  3. });
  4. // tak jak pisał ctom


no i jeżeli wpisze /pages -> to wyświetla pages
a jeżeli wpisze /pages/param1/param2 -> to już strona wywala błąd.

Czy parametry też można w bazie trzymać?
wiem że mogę zrobić:
/{slug}/{slug}/{slug}/{slug}/ no ale nie wiem ille zmiennych będę miał czy można zrobić to jakoś uniwersalnie?
Randallmaster
no pięknie o to mi właśnie chodziło exclamation.gif!!! php.gif

ostatnie pytanie?. prędzej miałem np. pod pages/index, listę stron z powodu zrobienia funkcji slug. wszystko mi zniknęło. Jak teraz z metody wyświetlić stronę?

mam :
Route::get('/{slug}', 'PagesController@validator')->where('slug', '.*');

i jak np. w validator wyświetlić stronę PagesController@edit z parametrem o id 1
Pyton_000
Musisz sobie parsować ręcznie adres otrzymany.
Robisz explode po / i np.

if(is_numeric($index[1]))
// show pages id = $index[1]
Randallmaster
zrobiłem to smile.gif tylko nie wiem jak wyświetlić to co miałem pod Route::get('pages/edit/{id}', 'PagesController@edit');

  1. $param = explode('/', $slug);
  2. $param['controller'] = $param[0];
  3. $param['action'] = $param[1];
  4. if($param['controller'] == 'pages' && $param['action'] == 'edit'){
  5. //jak wyświetlić metodę edit? pod nią mam cały widok i wszystko skonfigurowane
  6. }


już wiem return $this->index(); np.

no i jeszcze jedno?.

W którym miejscu najlepiej wykonać sprawdzanie $slug? i przesyłać do danego widoku?bo w tym przypadku nie mam problemu wyświetlam widok z tego samego kontrolera robiąc to za pomocą $this->index(), a co w przypadku jeśli będę miał inny kontroler? trochę bezsensu będzie to abym definiował każdy kontroler osobno.
Pyton_000
Generalnie ten route ze slug musi być na samym końcu pliku routes.php inaczej będzie ci przesłaniał wszystkie route po nim.

I nie za bardzo rozumiem o tych kontrolerach...
Randallmaster
aktualnie pracuje jeszcze na cakephp i tam route nie trzeba było definiować. Jest tam (controller + action + parametrs) dzięki temu mogłem zbudować interfejs do zarządzania rolami uprawnieniami stron oraz użytkowników (wszystko w jednym miejscu). W beforeFilter wykonałem sprawdzanie czy strona np. pages/edit już istnieje i czy użytkownik ma do niej uprawnienia. Jeżeli tak to przepuszczało do widoku. Laravel 5 skonstruowany jest na route.php no i z tego co teraz widzę musiałbym dodawać tam każdą stronę no i mam możliwość definiowania uprawnień za pomocą middleware. w Cakephp mam w podstawie około 150 stron. To w laraver musiałbym te 150 stron wpisać w route. A chcę poprostu rozwiązać to za pomocą podobnego interface. I trzymać wszystko w bazie w jednym miejscu. Dlatego myślałem żeby w route zostawić tylko taki wpis:

  1. Route::get('pages/edit/{id}', 'PagesController@edit');


A resztę sprawdzającą czyli czy użytkownik ma dostęp czy nie, sprawdzić w klasie i przekierowywać na konkretny widok.
Pyton_000
Ale co dla Ciebie oznacza "150 stron"
Czy jest to 150 treści czyli artykułów??

Bo jeśli tak, to tak; ten route wystarczy.

Tak, w cake jest global route które mapuje /controler/action/params...

Tutaj też możesz to zrobić coś na zasadzie.
Tak na szybko sklecona podobna funkcjonalność z CakePHP
  1. get('/{controller}/{action}/{params?}', function($controller, $action, $params = null) {
  2. $controller = 'App\\Http\\Controllers\\' . ucfirst($controller).'Controller';
  3. if(!class_exists($controller)) {
  4. throw new \Exception('There is no ' . $controller);
  5. }
  6. if(!method_exists($controller, $action)) {
  7. throw new \Exception('There is no Action ' . $action);
  8. }
  9.  
  10. $controller = new $controller;
  11. return call_user_func([$controller, $action], explode('/', $params));
  12.  
  13. })->where('params', '(.*)');


i kontroller:
  1. <?php
  2.  
  3. namespace App\Http\Controllers;
  4.  
  5. class HomeController extends Controller
  6. {
  7. public function index()
  8. {
  9. }
  10. }
Randallmaster
150 stron to mój podstawowy uniwersalny szablon*, którego używam do projektów (tworzenie użytkowników, uprawnienia, słowniki itp.), oczywiście będzie tego więcej w zależności od projektu, tylko odwołałem się do 150 bo to moja w chwili obecnej podstawa. Biorę się za sprawdzenie twojego kodu wink.gif Dzięki

wyskoczył mi błąd

Wywołanie strony pages/index/
  1. Argument 1 passed to App\Http\Controllers\PagesController::__construct() must be an instance of App\Http\Controllers\Pages\IndexController, none given, called in /Projects/default/app/Http/routes.php on line 29 and defined
  2.  
  3. PagesController:
  4. private $index;
  5. private $default;
  6. private $developer;
  7.  
  8. function __construct(IndexController $index, DefaultController $default, DeveloperController $developer)
  9. {
  10. $this->default = $default;
  11. $this->index = $index;
  12. $this->developer = $developer;
  13. }
  14.  
  15. route.php takie jak wysłał Pyton_000
Pyton_000
Zamień route na taki:
  1. get('/{controller}/{action}/{params?}', function($controller, $action, $params = null) {
  2. $controller = 'App\\Http\\Controllers\\' . ucfirst($controller).'Controller';
  3. if(!class_exists($controller)) {
  4. throw new \Exception('There is no ' . $controller);
  5. }
  6. if(!method_exists($controller, $action)) {
  7. throw new \Exception('There is no Action ' . $action);
  8. }
  9.  
  10. return call_user_func([app($controller), $action], explode('/', $params));
  11.  
  12. })->where('params', '(.*)');


Tylko tutaj jeszcze nie zadziała Method Injection które jest w Laravel.
Randallmaster
a z pomocą App:make można to wykonać ?
Pyton_000
finalnie możesz wywołać zamiast call_user_function coś takiego:

  1. return $this->app->call([app($controller), $action], explode('/', $params));

Randallmaster
return $this->app->call([app($controller), $action], explode('/', $params));
return call_user_func([app($controller), $action], explode('/', $params));

tak czy tak nie działa sad.gif w PagesController mam metodę index

BadMethodCallException in Controller.php line 283:
Method [index] does not exist.
styryl
No przecież masz info o błędzie Method [index] does not exist.
Randallmaster
napisałem powyżej że metoda istnieje. w PagesController a wywołuje stronę pages/index. więc powinno działać ;/

funkcja była jako private musiała być jako public i działa smile.gif

No i masz kolejny problem…..

Jeżeli zrobię w taki sposóļ route to nie działa ten zapis (czyli sposobem powyżej):

  1. // Form::open parametr action nie chce poprawnie działać
  2.  
  3. return isset($this->actionList[$action]) ? $this->actionList[$action] : null; //dokopałem się do mnejsca błędu...
  4.  
  5. // a dokładniej
  6. $action to oczywiście string. sprawdziłem var_dump.
  7. $this->actionList[$action])
  8. Method Illuminate\View\View::__toString() must not throw an exception
  9.  
  10. //dalej jeżeli zrobię to
  11. print_r($this->actionList);
  12.  
  13. //to ze sposobem powyżej tablica jest pusta jeżeli zmienię na: Route::get('pages/edit/{id}', 'PagesController@edit');
  14. tablica pokazuje masę wyników
  15.  


Brakuje mi pomysłów, pomożecie ? sad.gif
Pyton_000
Wiesz ze względu na to że Laravel ma speyficzny Routing to będzie masa problemów z tym związana przy zastosowaniu tej protezy z Cake.

Zastanów się czy nie możesz tego jakoś inaczej rozwiązać bez tego route.
Ja jak będę miał chwilkę to zerknę ocb.
Randallmaster
No ale w jaki sposób ty np. to robisz. Ręcznie wypisujesz po kolei każdą stronę w routes.php?

No i niekoniecznie mi zależy na tym by odwzorować cake w laravelu. Bardziej zależy mi by zrobić podobny interface, ze stronami, rolami, uprawnieniami itp. ponieważ to bardzo mi ułatwiło życie.
Pyton_000
Tak, wpisuję sobie routy. Jest ich sporo ale dzięki temu widzę jakie mam odwołania w serwisie.
Obecnie mam wygenerowanych ok 177 wpisów wink.gif

PS. Mam nadzieję że używasz paczek do np. ról i innych tworów.
nrm
@Randallmaster:



zapomnij o kejku, CI czy inny tworach z poprzedniej epoki.

przykład pierwszy z brzegu: https://github.com/laravelio/laravel.io/blo...Http/routes.php
https://github.com/CodepadME/laravel-tricks.../app/routes.php

inne podejście: https://github.com/cachethq/Cachet/tree/1.1/app/Http/Routes
Randallmaster
Generalnie do tej pory nie używałem paczek do ról bo nie potrzebowałem. Ale moje role działają prawie tak samo jak role do laravela (Zizaco/entrust), które właśnie sobie zaimplementowałem, z tym ze moje role obsługiwały jeszcze dodatkowo wizualizację menu smile.gif czego mi tu brakuje, dokładne:

nazwa strony w zależności od roli,
czy ma pokazywać w menu czy nie,
kolejność wyświetlania, itp.

Macie może jaką alternatywę w laravel'u? smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.