20210913のPHPに関する記事は4件です。

Laravelログイン認証のリダイレクトについて

はじめに  Laravelを使うと簡単にログイン機能を実装できますが、反面、完成されすぎていてカスタマイズするには結構調べないといけません。大した内容ではありませんが、今回はそんな中でもリダイレクトについて備忘録として残して行きたいと思います。 ログインしていないユーザーをリダイレクト  まずは、ログインしていない状態で、あるページにアクセスしようとするとログイン画面にリダイレクトする方法をご紹介します。ログイン前に表示させたくないコントローラーに下記のように書いてください。 HomeController.php public function __construct() { $this->middleware('auth'); }  これだけでOKです。何が起きているのかは正直よく分かりませんが、とにかくこれでログイン画面へリダイレクトされるようになります。認証に関わるものはMiddlewareで定義されています。ちなみに、リダイレクト先を変更する場合もMiddlewareで変更することが出来ます。 App\Http\Middleware\Authenticate.php  protected function redirectTo($request) { if (! $request->expectsJson()) { return route('リダイレクト先'); } }    デフォルトではloginがリダイレクト先になっていますが、自由に変えることが出来ます。 ログアウト後のリダイレクト  認証機能を実装すると当然ログアウト機能も付いてきますが、ログアウトするとLaravelのトップページへリダイレクトされます。これも変更していきたいと思います。こんな感じで書き換えてみましょう。 App\Http\Controllers\Auth\LoginController.php //use AuthenticatesUsers; use AuthenticatesUsers{ logout as doLogout; } public function logout(Request $request){ $this->doLogout($request); return redirect('/home'); }  これで、ログアウトするとhomeへリダイレクトするようになります。loginとするとログイン画面へ遷移します。 まとめ  こんな感じで結構簡単に書き換えることは可能ですが、中身を理解しようとすると結構時間かかると思います・・・。(自分も全然理解できてませんので、もっと勉強していこうと思います。)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

LaravelのRedisでワイルドカードのパターンに一致するキーを一括削除する

Redisではキーにワイルドカードを使って一括削除するコマンドがありません。 今回はLaravel5.8でRedisのキーをワイルドカードを使って、一括削除する方法を共有します。 一括削除する方法(prefixあり) $keyPattern = 'hogehoge_*'; $keys = array_map(function ($key) { return str_replace(config('database.redis.options.prefix'), '', $key); }, Redis::keys($keyPattern)); if (!empty($keys)) { Redis::del($keys); } 複数のコネクションを使っていてそれぞれprefixが違う場合は、 config('database.redis.options.prefix')の部分を適宜修正してください。 Laravel5.8からはデフォルトでprefixが指定されているので上記のprefixありで実行してください。 prefixを使っていない場合はこちらでもOK Redis::del(Redis::keys('hogehoge_*')); Laravel5.7はデフォルトだとprefixが指定されていないので、こちらでOK。 今回はリリース時の一部キャッシュのクリアでしたので、 php artisan tinkerで上記のコードを実行しました。 参考URL
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

composer installした際、メモリエラーになる場合の対応

docker環境でcomposer installした際、メモリエラーになる場合の対応。 PHP Fatal error: Allowed memory size of 1610612736 bytes exhausted (tried to allocate 4096 bytes) in phar:///usr/bin/composer/src/Composer/DependencyResolver/Solver.php on line 223 Fatal error: Allowed memory size of 1610612736 bytes exhausted (tried to allocate 4096 bytes) in phar:///usr/bin/composer/src/Composer/DependencyResolver/Solver.php on line 223 COMPOSER_MEMORY_LIMIT=-1を追加してcomposer installを実行する。 COMPOSER_MEMORY_LIMIT=-1 composer install
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PHP(Laravel) 空白を含む検索

はじめに 空白区切りで複数の検索をかけれるようにしたい。 【例】 "Ruby PHP JavaScript" → Ruby PHP JavaScript 条件 mac OS "11.2.3 Big Sur" Laravel Framework "6.20.27" PHP "8.0.7" 最終的なコード ControllerとModelに分かれています。 Controllerで使用している関数をModelの方で定義しています。 Controllers/SearchController.php class SearchController extends Controller { public function __construct(Search $search) { $this->search = $search; } public function index(Request $request) { $query = Recipe::query(); // エスケープ処理 $keyword = $this->escape($request->input('keyword')); // 空白区切りで文字列を分割 $keywords = $this->search->pregSplit($keyword); // 検索処理 $recipes = $this->search->searchQuery($query, $keywords); return view('search.index', [ 'recipes' => $recipes, 'keywords' => $keywords, 'searchCount' => $this->search->searchCount($recipes), ]); } /** * 検索欄に文字が入力された際、str_replaceを実行する * @param string $value * @return string $value */ private function escape(string $value = null) { if(!$value) { return $value; } return str_replace( ['\\', '%', '_'], ['\\\\', '\\%', '\\_'], $value ); } } Models/Search.php class Search extends Model { /** * 空白区切りで検索欄に入力された場合 * @param string $keyword * @return Array */ public function pregSplit($keyword) { // 全角空白→半角空白 $keyword = mb_convert_kana( $keyword, "s" ); return preg_split('/[\p{Z}\p{Cc}]++/u', $keyword, -1, PREG_SPLIT_NO_EMPTY); } /** * 検索処理 * @param \Illuminate\Database\Eloquent\Builder $query * @var string[]|false $keywords * @return \Illuminate\Database\Eloquent\Builder $query */ public function searchQuery($query, $keywords = null) { if(!empty($keywords)) { foreach ($keywords as $keyword) { $query->where('title', 'like', "%$keyword%") ->orWhere('cook_time', 'like', "%$keyword%") ->orWhere('ingredients', 'like', "%$keyword%") ->orWhereHas('tags', function($query) use ($keyword) { $query->where('name', 'like', "%$keyword%" ); }) ->orWhereHas('mealType', function($query) use ($keyword) { $query->where('name', 'like', "%$keyword%" ); }) ->orWhereHas('mealClass', function($query) use ($keyword) { $query->where('name', 'like', "%$keyword%" ); }); } } return $query->get()->sortByDesc('created_at') ->load('user', 'stocks', 'tags', 'mealType', 'mealClass'); } /** * 検索ヒット数カウント * @param mixed $recipes * @return int */ public function searchCount($recipes) { return $recipes->count(); } } 各コードの流れ Controllers/SearchController.php class SearchController extends Controller { public function __construct(Search $search) { $this->search = $search; } public function index(Request $request) { $query = Recipe::query(); // ① エスケープ処理 $keyword = $this->escape($request->input('keyword')); // ② 空白区切りで文字列を分割 $keywords = $this->search->pregSplit($keyword); // ③ 検索処理 $recipes = $this->search->searchQuery($query, $keywords); return view('search.index', [ 'recipes' => $recipes, 'keywords' => $keywords, 'searchCount' => $this->search->searchCount($recipes), ]); } /** * 検索欄に文字が入力された際、str_replaceを実行する * @param string $value * @return string $value */ private function escape(string $value = null) { if(!$value) { return $value; } return str_replace( ['\\', '%', '_'], ['\\\\', '\\%', '\\_'], $value ); } } ① エスケープ処理 ① のescape()は下の方に定義してあるように、文字の中に怪しい記号が入っていないかを調べています。 もし指定している記号\\, %, _があれば\\\\, \\%, \\_と置き換えてくれています。 ② 空白区切りで文字列を分割 $keywords = $this->search->pregSplit($keyword); // pregSplit()の内容 /** * 空白区切りで検索欄に入力された場合 * @param string $keyword * @return Array */ public function pregSplit($keyword) { // 全角空白→半角空白 $keyword = mb_convert_kana( $keyword, "s" ); return preg_split('/[\p{Z}\p{Cc}]++/u', $keyword, -1, PREG_SPLIT_NO_EMPTY); } まず、空白区切りが全角であれば半角にしてあげる。 $keyword = mb_convert_kana( $keyword, "s" ); 全て半角区切りにした次に、空白ごとに文字を分割してその値を返す。 preg_split('/[\p{Z}\p{Cc}]++/u', $keyword, -1, PREG_SPLIT_NO_EMPTY); ③ 検索処理 空白処理を行い、単語のみとなったため最後に検索をかけてヒットしたものを表示。 $recipes = $this->search->searchQuery($query, $keywords); // 検索処理 public function searchQuery($query, $keywords = null) { if(!empty($keywords)) { foreach ($keywords as $keyword) { $query->where('title', 'like', "%$keyword%") ->orWhere('cook_time', 'like', "%$keyword%") ->orWhere('ingredients', 'like', "%$keyword%") ->orWhereHas('tags', function($query) use ($keyword) { $query->where('name', 'like', "%$keyword%" ); }) ->orWhereHas('mealType', function($query) use ($keyword) { $query->where('name', 'like', "%$keyword%" ); }) ->orWhereHas('mealClass', function($query) use ($keyword) { $query->where('name', 'like', "%$keyword%" ); }); } } return $query->get()->sortByDesc('created_at') ->load('user', 'stocks', 'tags', 'mealType', 'mealClass'); } おわり 正規表現あたりが今だに慣れないので、少しずつ慣れていきたい。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む