Я надеюсь, что кто-то может помочь мне с динамической маршрутизацией для URL-адресов, которые могут иметь несколько сегментов. Я занимаюсь поиском по всему Интернету, но ничто из этого не помогает в моей конкретной ситуации.
Немного истории … Несколько лет назад я разработал пакет CMS для пользовательских клиентских сайтов, который был построен на CodeIgniter. Этот пакет CMS имеет несколько модулей (страницы, блоги, календарь, запросы и т. Д.). Для модуля Pages я кэшировал маршруты в конфигурационный файл «настраиваемые маршруты», который связывал полный маршрут для страницы (включая родителя, дедушку и т. Д.) С идентификатором страницы. Я сделал это, так что мне не нужно было искать базу данных, чтобы найти страницу для отображения.
В настоящее время я работаю над восстановлением этого пакета CMS с использованием Laravel (5.1) [пока я изучаю Laravel]. Мне нужно выяснить ситуацию маршрутизации, прежде чем я смогу перейти с модулем Pages в новой версии пакета.
Я знаю, что могу сделать что-то вроде …
// routes.php Route::get('{slug}', ['uses' => 'PageController@view']); // PageController.php class PageController extends Controller { public function view($slug) { // do a query to get the page by the slug // display the view } }
И это сработает, если я не разрешу вложенные страницы, но это так. И я только применяю уникальность пули на основе родителя. Таким образом, может быть более одной страницы с пугом fargo …
Как и в случае с пакетом, который я создал с помощью 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]); });
В основном, я хотел бы привязать определенный маршрут к определенному идентификатору страницы при создании страницы (или при изменении слияния или родителя).
Я только что переусердствовал?
Любая помощь или руководство в отношении этого были бы весьма признательны.
Благодаря!
То, как я обрабатываю это, – это использовать два маршрута: один для главной страницы (который обычно содержит более сложную логику, например, новости, подбор статей, баннеров и т. Д.) И уловку для любой другой страницы.
// Home page Route::get('/', [ 'as' => 'home', 'uses' => 'PageController@index' ]); // Catch all page controller (place at the very bottom) Route::get('{slug}', [ 'uses' => 'PageController@getPage' ])->where('slug', '([A-Za-z0-9\-\/]+)');
Важная часть, которую следует отметить в приведенном выше, – это метод ->where()
связанный в конце маршрута. Это позволяет объявлять соответствие шаблонов регулярных выражений для параметров маршрута. В этом случае я разрешаю буквенно-цифровые символы, дефисы и косые черты для параметра {slug}
.
Это будет соответствовать слипам вроде
test-page
test-page/sub-page
another-page/sub-page
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); }
Я сохраняю информацию о файле шаблона в базе данных, так как я разрешаю пользователям создавать шаблоны в системе управления контентом.
Ответ от запроса в базе данных затем передается в представление, где его можно выводить на метаданные, страницу, панировочные сухари и т. Д.
Я также искал тот же ответ, что и о создании динамической маршрутизации в 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].'Controller@'.$asif[1]); } if(isset($post2)) { Route::match(array('GET','POST'),$post.'/'.$post1.'/{id}',$asif[0].'Controller@'.$asif[1]); } Route::get('/', function () { return view('welcome'); });
бывший
если у вас есть PostController с методом hello в laravel. Вы можете использовать этот URL http: // localhost / shortproject / public / post / hello . Где shortproject – имя вашего проекта.