2017-02-12 27 views
0

Я использую OctoberCMS на основе Laravel.Как анализировать идентификаторы сегмента URL в Laravel?

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

Посещение localhost/user/john/nature проанализирует и отфильтрует эти результаты.

URL → Идентификаторы → Param Переменные → Область → База данных результатов

Routing Parameters

Query Scopes

Page

[builderDetails builderUser] 
identifierValue "{{ :username }}" 

[builderDetails builderCategory] 
identifierValue "{{ :category }}" 

[builderList] 
scope = "scopeApplyType" 

url = /user/:username?/:category?/:page? 

Модель Объем

Я хочу отфильтровать результаты базы данных, используя идентификаторы URL: имя пользователя и: категорию.

public function scopeApplyType($query) { 
    $params = ['username' => $username, 'category' => $category]; 
    return $query->where($params); 
} 

Получить Идентификаторы

Это будет выводить запрашиваемые identifers в URL, в routes.php

Route::get('user/{username?}/{category?}', function ($username = null, $category = null) { 
    echo $username; 
    echo $category; 
}); 

Выход

localhost/user/john/nature 

john 
nature 

Soultion?

Маршрут :: get() не будет работать, мне нужно что-то внутри или передать в область действия, чтобы определить переменные params.

Что-то вроде:

$username = '{username?}'; 
$username = request()->url('username'); 
$username = $this->param('username'); //Components) 
$username = $this->route('username'); 
$username = \Route::current()->getParameter('username'); 

Все возвращают нуль или ошибка.

Как, как вы обычно синтаксический анализ Запроса

$param = "username=john&category=nature"; 
$username = $category = ''; 
parse_str($param); 
echo $username; 
echo $category; 

Или похож на запрос сегмента

$username = request()->segment(2); //user/:username 

сегмент (2) представляет собой статическое расположение в отличие от {: категория}, которая может изменить позицию по разные URL-адреса.

+0

Вы пробовали '$ request-> route ('parameter_name')' или '$ request-> route() -> parameters()'? –

+0

@BenSwinburne Я получаю неопределенную переменную: request –

+0

Вам нужно будет получить объект запроса 'request()' должен дать вам это. 'request() -> route()' –

ответ

0

Учитывая следующий маршрут

Route::get('foo/{name?}', function ($name = null) { 
    dd(request()->route()->parameters()); 
}); 

При посещении/Foo/бар на выходе, как показано ниже.

array:1 [▼ 
    "name" => "bar" 
] 

Аналогично вы можете использовать

dd(request()->route()->parameter('name')); // bar 
+0

Я использовал OctoberCMS для создания страницы. Когда я использую Route :: get() в routes.php, он переопределяет мою страницу пустым. Я использовал dd() с именем «username», и он вернул пустую страницу со словом «null». Но «slug» возвратил «user/john», весь uri. –

+0

Я могу получить идентификатор {имя пользователя?} С $ username = $ this-> param ('username') только при использовании на странице php, но как использовать тот же код в модели или отправить в область? –

+0

Что означает '$ this'? вышеупомянутый способ - это способ Laravel 5 сделать это, чтобы он работал. Какую версию Laravel вы используете? –

1

То, что вы пытаетесь сделать, вышло за рамки самых основных компонентов, предусмотренных builder plugin.

Теперь вы должны посмотреть на создание собственных компонентов в своем плагине. См http://octobercms.com/docs/plugin/components и http://octobercms.com/docs/cms/components для получения дополнительной информации, а также section on routing parameters specifically

Очень простой пример пользовательского компонента может выглядеть следующим образом:

<?php namespace MyVendor/MyPlugin/Components; 

use Cms\Classes\ComponentBase; 
use MyVendor\MyPlugin\Models\Result as ResultModel; 

class MyComponent extends ComponentBase 
{ 
    public $results; 

    public function defineProperties() 
    { 
     return [ 
      'categorySlug' => [ 
      'title' => 'Category Slug', 
      'type' => 'string', 
      'default' => '{{ :category }}', 
      ], 
      'username' => [ 
       'title' => 'Username', 
       'type' => 'string', 
       'default' => '{{ :username }}', 
      ], 
     ]; 
    } 

    public function init() 
    { 
     $this->results = $this->page['results'] = $this->loadResults(); 
    } 

    public function loadResults() 
    { 
     return ResultModel::where('username', $this->property('username')) 
         ->where('category', $this->property('categorySlug')) 
         ->get(); 
    } 
} 

Тогда в силу default.htm вашего компонента вы могли бы сделать что-то как это:

{% for result in __SELF__.results %} 
    {{ result.title }} 
{% endfor %} 

А на странице OctoberCMS:

url = /user/:username?/:category?/:page? 

[myComponent] 
categorySlug = "{{ :category }}" 
username = "{{ :username }}" 
== 
{% component 'myComponent' %} 
+0

https://octobercms.com/docs/database/model#query-scopes Здесь в разделе «Динамические области видимости» показано, как применять тип, но он не работает. Я положил его на страницу htm php и направил его на свой пользовательский компонент. $ user = Галерея :: applyType ('john') -> get(); В нем говорится: «Вызовите неопределенный метод October \ Rain \ Database \ QueryBuilder :: applyType()». –

+0

Я попробую ваше решение и добавлю свой код в свой компонент. –

+0

@MattMcManis, как вы написали свой метод scope в своей модели? Он должен быть определен в виде публичной функции scopeApplyType ($ query, $ type) – LukeTowers

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

  • Нет связанных вопросов^_^