Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> [inny][Laravel 5]Routes from DataBase
Randallmaster
post 28.07.2015, 11:38:07
Post #1





Grupa: Zarejestrowani
Postów: 677
Pomógł: 11
Dołączył: 18.11.2009

Ostrzeżenie: (0%)
-----


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(…..

Ten post edytował Randallmaster 28.07.2015, 11:52:45
Go to the top of the page
+Quote Post
ctom
post 28.07.2015, 13:31:49
Post #2





Grupa: Zarejestrowani
Postów: 321
Pomógł: 55
Dołączył: 19.04.2009

Ostrzeżenie: (0%)
-----


Kod
Route::get('/{slug}', function($slug){
    // 'slug' to indentyfikator strony w Twojej bazie
});


Ten post edytował ctom 28.07.2015, 13:31:59


--------------------
Polecam MyDevil hosting idealny dla deweloperów
Go to the top of the page
+Quote Post
Randallmaster
post 28.07.2015, 14:53:33
Post #3





Grupa: Zarejestrowani
Postów: 677
Pomógł: 11
Dołączył: 18.11.2009

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
Pyton_000
post 28.07.2015, 16:13:53
Post #4





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Randallmaster
post 11.08.2015, 16:53:48
Post #5





Grupa: Zarejestrowani
Postów: 677
Pomógł: 11
Dołączył: 18.11.2009

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
Pyton_000
post 11.08.2015, 17:03:13
Post #6





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


http://blog.piotrows.pl/laravel-lumen-rotue-wildcard/
Go to the top of the page
+Quote Post
Randallmaster
post 11.08.2015, 17:53:08
Post #7





Grupa: Zarejestrowani
Postów: 677
Pomógł: 11
Dołączył: 18.11.2009

Ostrzeżenie: (0%)
-----


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

Ten post edytował Randallmaster 11.08.2015, 19:19:30
Go to the top of the page
+Quote Post
Pyton_000
post 11.08.2015, 20:04:09
Post #8





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


Musisz sobie parsować ręcznie adres otrzymany.
Robisz explode po / i np.

if(is_numeric($index[1]))
// show pages id = $index[1]
Go to the top of the page
+Quote Post
Randallmaster
post 11.08.2015, 20:50:41
Post #9





Grupa: Zarejestrowani
Postów: 677
Pomógł: 11
Dołączył: 18.11.2009

Ostrzeżenie: (0%)
-----


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.

Ten post edytował Randallmaster 11.08.2015, 20:52:01
Go to the top of the page
+Quote Post
Pyton_000
post 11.08.2015, 21:26:11
Post #10





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


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...
Go to the top of the page
+Quote Post
Randallmaster
post 12.08.2015, 07:19:10
Post #11





Grupa: Zarejestrowani
Postów: 677
Pomógł: 11
Dołączył: 18.11.2009

Ostrzeżenie: (0%)
-----


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.

Ten post edytował Randallmaster 12.08.2015, 07:21:37
Go to the top of the page
+Quote Post
Pyton_000
post 12.08.2015, 08:12:12
Post #12





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


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. }


Ten post edytował Pyton_000 12.08.2015, 08:13:40
Go to the top of the page
+Quote Post
Randallmaster
post 12.08.2015, 09:16:10
Post #13





Grupa: Zarejestrowani
Postów: 677
Pomógł: 11
Dołączył: 18.11.2009

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
Pyton_000
post 12.08.2015, 10:34:48
Post #14





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


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.

Ten post edytował Pyton_000 12.08.2015, 10:48:39
Go to the top of the page
+Quote Post
Randallmaster
post 12.08.2015, 11:31:09
Post #15





Grupa: Zarejestrowani
Postów: 677
Pomógł: 11
Dołączył: 18.11.2009

Ostrzeżenie: (0%)
-----


a z pomocą App:make można to wykonać ?
Go to the top of the page
+Quote Post
Pyton_000
post 12.08.2015, 11:44:35
Post #16





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


finalnie możesz wywołać zamiast call_user_function coś takiego:

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

Go to the top of the page
+Quote Post
Randallmaster
post 12.08.2015, 11:55:53
Post #17





Grupa: Zarejestrowani
Postów: 677
Pomógł: 11
Dołączył: 18.11.2009

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
styryl
post 12.08.2015, 12:33:11
Post #18





Grupa: Zarejestrowani
Postów: 223
Pomógł: 27
Dołączył: 16.04.2008
Skąd: Bakutilu

Ostrzeżenie: (0%)
-----


No przecież masz info o błędzie Method [index] does not exist.
Go to the top of the page
+Quote Post
Randallmaster
post 12.08.2015, 20:01:45
Post #19





Grupa: Zarejestrowani
Postów: 677
Pomógł: 11
Dołączył: 18.11.2009

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
Pyton_000
post 12.08.2015, 20:53:48
Post #20





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 21.06.2025 - 15:43