У меня есть контроллер, который обрабатывает фильтры запросов, теперь, когда часть фильтра требует, чтобы пользователи вошли в систему, чтобы применить фильтр. Какой для этого лучший подход? ценю любую помощь! большое спасибо!
Маршрут API: Route :: get ('список игрушек', 'список игрушек @ index');
use Illuminate\Support\Facades\DB;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use App\Toylist;
class ToyslistController extends Controller
{
public function index(Request $request)
{
$toyslist = (new Toylist)->newQuery();
if ($request->has('type')){
$toy_typeArray = explode(',',$request->type);
$toyslist->whereIn('type',$toy_typeArray);
}
if ($request->has('age')){
$toy_ageArray = explode(',',$request->type);
$toyslist->whereIn('age',$toy_ageArray);
}
if ($request->has('brand')){
$toy_brandArray = explode(',',$request->type);
$toyslist->whereIn('brand',$toy_brandArray);
}
if ($request->has('storage')){
if (Auth::check()){
$toy_storageArray = explode(',',$request->type);
$toyslist->whereIn('storage',$toy_storageArray);
}
}
return $toyslist->paginate(15);
}
}
с Route :: get Auth :: check () или Auth :: id () всегда возвращает пустое значение, я не хочу использовать промежуточное ПО в маршруте, чтобы заблокировать публичное использование фильтров. Есть ли способ сделать это или мне нужно воспроизвести тот же метод с промежуточным программным обеспечением маршрута и оставить это промежуточному программному обеспечению без маршрута?
Единственное, что я бы изменил, - это поставить проверку аутентификации в проверке над ней, например. if ($request->has('storage') && Auth::check()) {.
Auth::check() не должен возвращать false, если пользователь не вошел в систему. Используете ли вы промежуточное ПО web по вашему запросу или это маршрут API?
Просто проверяю, но я предполагаю, что $request->type не предназначен для использования во всех операторах if?
это в маршруте Api
Извините, я не понимаю, о чем вы? Росс
@NewProgrammer Он ссылается на все операторы if, используя $request->type в качестве аргумента взрыва. Также по умолчанию проверка подлинности API отличается от проверки подлинности в Интернете, поэтому вы получаете ответ null / false.
запрос if $ предназначен для использования таким образом, поскольку интерфейс использует localhost / api / toyslist? brand = 1,2,3 & age = 5,9
Вы используете один и тот же ввод для всех массивов. Эффективно выполняя следующий localhost/api/toyslist?type=1,2,3&age=5,9, тогда ваш массив типа и возраста вернет этот type: 1,2,3age: 1,2,3
да, это для того, чтобы иметь возможность использовать whereIn для запроса. Но проблема с функциями фасада Auth все еще существует. Есть идеи, что будет лучше?
По умолчанию маршруты API не запускают сеанс, поскольку они не имеют состояния. Предполагается, что API не имеет состояния и не должен полагаться на сеансы. Если вы хотите использовать аутентификацию на основе сеанса, используйте Web Guard для своих маршрутов.
Да, Toyslist является частью API и не имеет состояния. Но только определенный фильтр требует, чтобы пользователь вошел в систему. Если я не использую аутентификацию на основе сеанса, как еще мне подойти к ситуации?
@NewProgrammer Вы можете использовать что-то вроде Паспорт Laravel
Я уже реализовал паспорт, логин основан на паспорте






На данный момент я сделал следующее, чтобы это работало:
Добавлен маршрут API:
Route::middleware('auth:api')->get('protectedtoyslist','toyslistController@index');
Route::get('toyslist','toyslistController@index');
Таким образом, интерфейс использует localhost/api/toyslist для фильтрации продуктов без фильтра хранения для пользователей, которые не вошли в систему.
Для вошедших в систему пользователей интерфейс использует localhost/api/protectedtoyslist для фильтрации продуктов, которые включают фильтр хранения.
Очень признателен, если у кого-то есть лучший подход для этого. Спасибо!
Что не так с вашим нынешним подходом?