в контроллере входа используется метод intended
.
public function login(Request $request)
{
if ($this->guard()->attempt(...)) {
return redirect()->intended(route('home'));
} else {...}
}
он будет пытаться перенаправить на нужную страницу, прежде чем перехватится промежуточным ПО если он не может найти нужную страницу, он будет перенаправлен на страницу home
.
Я высоко ценю решение Маттиаса за его простоту и красоту.
Однако, хотя это дает отличные результаты для небольших объемов данных, при работе с большими объемами данных производительность не так хороша из-за рефлексии.
Я провел тест с набором простых объектов данных, насчитывающим 100000 элементов. Сортировка по свойству целочисленного типа заняла около 1 минуты. Реализация, которую я собираюсь более подробно описать, изменила это значение на ~ 200 мс.
Основная идея состоит в том, чтобы извлечь выгоду из строго типизированного сравнения, сохранив общий метод ApplySortCore. Следующее заменяет общий делегат сравнения вызовом конкретного компаратора, реализованного в производном классе:
Новое в SortableBindingList
protected abstract Comparison<T> GetComparer(PropertyDescriptor prop);
ApplySortCore изменяется на:
protected override void ApplySortCore(PropertyDescriptor prop, ListSortDirection direction)
{
List<T> itemsList = (List<T>)this.Items;
if (prop.PropertyType.GetInterface("IComparable") != null)
{
Comparison<T> comparer = GetComparer(prop);
itemsList.Sort(comparer);
if (direction == ListSortDirection.Descending)
{
itemsList.Reverse();
}
}
isSortedValue = true;
sortPropertyValue = prop;
sortDirectionValue = direction;
}
Теперь,
Я погуглил и попробовал самостоятельно еще некоторое время...
Нет никакого встроенного пути в.NET до сих пор. Необходимо реализовать пользовательский класс на основе BindingList<T>
. Один путь описан в Пользовательской Привязке данных, Часть 2 (MSDN). Я наконец произвожу другую реализацию ApplySortCore
- метод для обеспечения реализации, которая не проекта зависима.
protected override void ApplySortCore(PropertyDescriptor property, ListSortDirection direction)
{
List<T> itemsList = (List<T>)this.Items;
if(property.PropertyType.GetInterface("IComparable") != null)
{
itemsList.Sort(new Comparison<T>(delegate(T x, T y)
{
// Compare x to y if x is not null. If x is, but y isn't, we compare y
// to x and reverse the result. If both are null, they're equal.
if(property.GetValue(x) != null)
return ((IComparable)property.GetValue(x)).CompareTo(property.GetValue(y)) * (direction == ListSortDirection.Descending ? -1 : 1);
else if(property.GetValue(y) != null)
return ((IComparable)property.GetValue(y)).CompareTo(property.GetValue(x)) * (direction == ListSortDirection.Descending ? 1 : -1);
else
return 0;
}));
}
isSorted = true;
sortProperty = property;
sortDirection = direction;
}
Используя этого, можно отсортировать по любому участнику, который реализует IComparable
.
Не для пользовательских объектов. В.Net 2.0 я должен был прокрутить мой при сортировке использования BindingList. Может быть что-то новое в.Net 3.5, но я еще не изучил это. Теперь, когда существует LINQ и опции сортировки, которые идут, если это теперь может быть легче реализовать.