2015-10-07 3 views
10

Я надеюсь, что кто-то может помочь мне с динамической маршрутизацией для URL-адресов, которые могут иметь несколько сегментов. Я занимаюсь поиском по всему Интернету, но ничто из этого не помогает в моей конкретной ситуации.Динамическая маршрутизация в Laravel 5 Приложение

Немного фона ... Несколько лет назад я разработал пакет CMS для пользовательских клиентских сайтов, который был построен на CodeIgniter. Этот пакет CMS имеет несколько модулей (страницы, блоги, календарь, запросы и т. Д.). Для модуля Pages я кэшировал маршруты в конфигурационный файл «настраиваемые маршруты», который связывал полный маршрут для страницы (включая родителя, дедушку и т. Д.) С идентификатором страницы. Я сделал это, так что мне не нужно было искать базу данных, чтобы найти страницу для отображения.

В настоящее время я работаю над восстановлением этого пакета CMS с использованием Laravel (5.1) [пока я изучаю Laravel]. Мне нужно выяснить ситуацию маршрутизации, прежде чем я смогу перейти с модулем Pages в новой версии пакета.

Я знаю, что я могу сделать что-то вроде ...

// routes.php 
Route::get('{slug}', ['uses' => '[email protected]']); 

// PageController.php 
class PageController extends Controller 
{ 
    public function view($slug) 
    { 
     // do a query to get the page by the slug 
     // display the view 
    } 
} 

И это будет работать, если я не позволял вложенных страниц, но я делаю. И я только применяю уникальность пули на основе родителя. Так что может быть более чем одна страница с слизняк из Фарго ...

  • места/Фарго
  • персонал/Фарго

Как с пакетом, который я построил с помощью CodeIgniter, я хотел бы иметь возможность избежать дополнительных запросов к базам данных, чтобы найти нужную страницу для отображения.

Моя первоначальная мысль заключалась в том, чтобы создать конфигурационный файл, который будет иметь динамические маршруты, как я сделал со старой версией системы. Маршруты будут меняться только в определенное время (когда страница будет создана, когда slug будет изменен, когда родитель будет изменен), поэтому «кэширование» будет работать отлично. Но я все еще новичок в Laravel, поэтому я не уверен, что лучший способ сделать это.

Мне удалось выяснить, что работают следующие маршруты. Но это лучший способ установить это?

Route::get('about/foobar', function(){ 
    return App::make('\App\Http\Controllers\PageController')->callAction('view', [123]); 
}); 

Route::get('foobar', function(){ 
    return App::make('\App\Http\Controllers\PageController')->callAction('view', [345]); 
}); 

В принципе, я хотел бы связать конкретный маршрут к конкретной странице ID при создании страницы (или когда пробковый или один из родителей изменены).

Я просто преувеличиваю вещи?

Любая помощь в этом отношении была бы принята с благодарностью.

Спасибо!

+0

«Я только что преувеличиваю?», ИМО «Да». Кроме того, эти маршруты выглядят как статические, нет динамизма, если вы не допускаете каких-либо заполнителей для 'ID'. Каждый маршрут связан только с одним конкретным «id». –

+0

Как я планирую настроить ситуацию, я не думаю, что есть какой-либо способ использовать динамический маршрут, который не потребует от меня дополнительных запросов к базе данных, чтобы найти нужную страницу. Я буду использовать динамические маршруты для других модулей, таких как блог, но для обычных страниц я не думаю, что это сработает. – Becky

ответ

18

Способ, которым я управляю этим, состоит в том, чтобы использовать два маршрута: один для главной страницы (который обычно содержит более сложную логику, например, новости, подбор статей, баннеров и т. Д.) И уловку для любой другой страницы.

Маршруты

// Home page 
Route::get('/', [ 
    'as'  => 'home', 
    'uses' => '[email protected]' 
]); 

// Catch all page controller (place at the very bottom) 
Route::get('{slug}', [ 
    'uses' => '[email protected]' 
])->where('slug', '([A-Za-z0-9\-\/]+)'); 

важная часть, чтобы отметить в приведенном выше является ->where() метод прикован на конце маршрута. Это позволяет объявлять соответствие шаблонов регулярных выражений для параметров маршрута.В этом случае я разрешаю буквенно-цифровые символы, дефисы и косые черты для параметра {slug}.

Это будет соответствовать слизням как
test-page
test-page/sub-page
another-page/sub-page

Метода PageController

public function index() 
{ 
    $page = Page::where('route', '/')->where('active', 1)->first(); 

    return view($page->template) 
     ->with('page', $page); 
} 

public function getPage($slug = null) 
{ 
    $page = Page::where('route', $slug)->where('active', 1); 

    $page = $page->firstOrFail(); 

    return view($page->template)->with('page', $page); 
} 

Я хранить информацию файла шаблона в базе данных, так как я позволяю пользователям создавать шаблоны в система управления контентом.

Ответ от запроса к базе данных затем передается в представление, где он может быть выведен к метаданным, страница, сухари и т.д.

+0

Как я уже упоминал в своем вопросе, у двух разных страниц может быть один и тот же слизняк, если у них разные родители. Поэтому я не могу сделать то, что вы предложили. И я не хочу делать несколько поисков, чтобы найти правильный родитель. – Becky

+0

@Becky В столбце slug в базе данных будет содержаться FULL slug. IE. 'Местоположения/fargo'. Таким образом, вам никогда не придется беспокоиться о дубликатах. Есть ли причина, по которой вы используете последний сегмент для вашего слизня? – Jeemusu

+0

Слишком просто страница, основанная на названии. То, что вы предложили, будет полной постоянной ссылкой, и это не то, что я ищу. – Becky

-7

Я также искал тот же ответ, который о создании Динамическая маршрутизация в Laravel я пришел с этим: в routes.php

<?php 


/* 
|-------------------------------------------------------------------------- 
| Application Routes 
|-------------------------------------------------------------------------- 
| 
| Here is where you can register all of the routes for an application. 
| It's a breeze. Simply tell Laravel the URIs it should respond to 
| and give it the controller to call when that URI is requested. 
| 
*/ 

$str=Request::url(); 
$del="/public/"; 
$pos=strpos($str, $del); 
$important1=substr($str, $pos+strlen($del), strlen($str)-1); 
$important=ucfirst($important1); 
$asif=explode("/", $important); 
$asif1=explode("/", $important1); 
//echo $important; 
$post=$asif1[0]; 
$post1=$asif1[1]; 
if(isset($asif1[2])) 
{ 
    $post2=$asif1[2]; 
} 
if(!(isset($post2))) 
{ 
    Route::match(array('GET','POST'),$important1, $asif[0].'[email protected]'.$asif[1]); 
} 
if(isset($post2)) 
{  Route::match(array('GET','POST'),$post.'/'.$post1.'/{id}',$asif[0].'[email protected]'.$asif[1]); 
} 
Route::get('/', function() { 
    return view('welcome'); 
}); 

Ex

, если у вас есть PostController методом привет в Laravel. Вы можете использовать этот URL http://localhost/shortproject/public/post/hello. Где shortproject - имя вашего проекта.

Смежные вопросы