Удобный URI с Laravel? [Дубликат]

Принятый ответ работает, но немного больше объяснений не повредит.

Атрибуты класса не становятся атрибутами экземпляра при создании экземпляра. Они становятся атрибутами экземпляра, когда им присваивается значение.

В исходном коде значение no присваивается атрибуту list после создания экземпляра; поэтому он остается атрибутом класса. Определение списка внутри __init__ работает, потому что __init__ вызывается после создания экземпляра. В качестве альтернативы, этот код также выдаст желаемый результат:

>>> class a:
    list = []

>>> y = a()
>>> x = a()
>>> x.list = []
>>> y.list = []
>>> x.list.append(1)
>>> y.list.append(2)
>>> x.list.append(3)
>>> y.list.append(4)
>>> print(x.list)
[1, 3]
>>> print(y.list)
[2, 4]

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

>>> class a:
    string = ''


>>> x = a()
>>> y = a()
>>> x.string += 'x'
>>> y.string += 'y'
>>> x.string
'x'
>>> y.string
'y'

Итак, чтобы суммировать: атрибуты класса становятся атрибутами экземпляра тогда и только тогда, когда им присваивается значение после создания, в методе __init__ или нет. Это хорошо, потому что таким образом вы можете иметь статические атрибуты, если никогда не присваиваете значение атрибуту после создания экземпляра.

4
задан MartinJH 11 June 2015 в 17:31
поделиться

2 ответа

Да, вы можете использовать slug в своем route и сгенерировали url, например, если вы объявите маршрут примерно так:

Route::get('users/{username}', 'UserController@profile')->where('profile', '[a-z]+');

Затем в вашем контроллере вы может объявить метод следующим образом:

public function profile($username)
{
    $user = User::where('username', $username)->first();
}

Здесь username является вашим slug, и он должен быть строкой из-за where()... в объявлении маршрута. Если передан integer, тогда route не может быть найден и ошибка 404 будет выбрана.

7
ответ дан The Alpha 31 August 2018 в 16:02
поделиться

Начиная с Laravel 5.2, если вы используете привязку модели маршрута, вы можете сделать свои маршруты, которые содержат идентификатор объекта, как обычно ( Неявное связывание ). Например:

В routes/web.php (Laravel 5.3) или app/Http/routes.php (Laravel 5.2):

Route::get('categories/{category}', 'CategoryController@show');

В вашем CategoryController:

show (Category $category) {
    //
}

Единственное, что вам нужно сделать, это сообщить Laravel прочитать идентификатор из другого столбца, например, столбца slug, настроив имя ключа в вашей красноречивой модели:

/**
 * Get the route key for the model.
 *
 * @return string
 */
public function getRouteKeyName()
{
    return 'slug';
}

Теперь вы можете ссылаться на свой url, для которого требуется идентификатор объекта с идентификатором slug вместо id.

См. Laravel 5.3 (или 5.2).

2
ответ дан Caco 31 August 2018 в 16:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: