20210914のlaravelに関する記事は10件です。

自分用 Laravel 備忘録(基礎用語編)

※自分が確認する用です。 基礎用語編 artisan(アルチザン) ファイル作成や設定、DB操作など様々な操作が出来るコマンド。 Auth ユーザ認証・ログイン管理。 csrfトークン ユーザの意図しないリクエスト送信を防ぐ。 Blade Laravelテンプレートエンジン。〜blade.php。書き方は基本HTML。 Bootstrap webページのレイアウトの見え方を制御するフレームワーク。 Eloquent(エロクエント) DBのレコードをオブジェクトとして扱えるようにしてくれる(リレーション)をしてくれる、Laravel内蔵のORM。 HTTPリクエスト ブラウザ⇄web間のやり取りで定められた手順。 get.post.put(更新).delete(削除).head(ヘッダ取り出し)など。 Migration データベースを作成、管理する。 Requesut ユーザー情報の全てを取得してくれる。 rollback 実行されたMigrationのテーブル、カラムやデータ型を変更する時に使用。 Routing アクセスを個別のController内のActionに割り当てる。Route::での指定。 Sass CSSを管理するフレームワーク。コンパイルする時は、ターミナルの処理を忘れずに。 $ npm run watch $this メソッド外で定義された変数などをメソッド内で呼び出す際に使用する。 Validation Modelに保存する前に、データの不備を検証する。 webpack cssやJavaScriptを1つにまとめる。 インスタンス化 クラス(設計図)からインスタンス(実体)を生成すること。 継承 レイアウトを作成し、他のBladeファイルでも使用できるようにする。 デプロイ アプリケーションを本稼働(サーバを用意してアプリケーションをインストール)する。 @ Bladeファイルでメソッドなどを使用する時に用いる。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

自分用

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel Sail 導入時に発生したエラーと解決方法

Laravel Sailを使ってLaravelをインストールしてみようとしたときのうっかりミスとその解決方法。 うっかり編 公式ページに書いてあるインストレーションを進める。 $ curl -s "https://laravel.build/example-app" | bash docker: Error: remote trust data does not exist for docker.io/laravelsail/php80-composer: notary.docker.io does not have trust data for docker.io/laravelsail/php80-composer. See 'docker run --help'. bash: line 16: cd: example-app: No such file or directory Please provide your password so we can make some final adjustments to your application's permissions. Password: Thank you! We hope you build something incredible. Dive in with: cd example-app && ./vendor/bin/sail up エラーが表示されていたが「Thank you!」って言ってるし、進める。 $ cd example-app && ./vendor/bin/sail up cd: no such file or directory: example-app ディレクトリがないと言われるので、疑問に感じつつも、自分で作る。 $ mkdir example-app モッカイヤッテミル。 $ cd example-app && ./vendor/bin/sail up zsh: no such file or directory: ./vendor/bin/sail エラー解決編 もう一度、最初のエラーを解決して進めます。 docker: Error: remote trust data does not exist for docker.io/laravelsail/php80-composer: notary.docker.io does not have trust data for docker.io/laravelsail/php80-composer. 上記のエラーは、こちらの記事によるとDockerのセキュリティ機能DOCKER_CONTENT_TRUST(DCT)が有効になっているというのがエラーの原因でした。 # 環境変数を設定。 $ export DOCKER_CONTENT_TRUST=0 # もう一度実行。 $ curl -s "https://laravel.build/example-app" | bash # インストレーションが進む中に以下のテキストが、、、! Application already exists! 先ほど、ディレクトリを消し忘れておりました 自分で作ったexample-appを削除し、再度実行。 $ curl -s "https://laravel.build/example-app" | bash 無事、Laravelがインストールされました! 結論編 Laravel Sailはディレクトリは自動生成してくれるので、自分で作らないように。 あと、エラーがあっても We hope you build something incredible. Dive in with: cd example-app && ./vendor/bin/sail up と進めてくるので注意です。 初歩的なミスでしたが誰かの参考になれば幸いです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【実務で使えるLaravel】取得したデータを配列に追加する方法

実務の学びを記事にします。 取得したデータを配列に追加する方法です。 $hoge = array(); $categories = $this->category->findCategories(); foreach ($categories as $category) { array_push($hoge, $category->category_name); } $categoriesはコレクションでカテゴリーデータを何件か取得するロジックです。 まず、$hoge = array()で空の配列を用意し、array_pushで配列の最後に要素を追加できます。 array:3 [▼ 0 => "85HCKP3sfL" 1 => "XOF4msHVdd" 2 => "ir10PRKDGp" ] こんな感じで配列にカテゴリーの名前を追加できます。 もう一つプラスαで覚えておくべきは、in_arrayです。 if (in_array('aaa', $hoge)) { echo 'true'; } else { echo 'false'; } こんな感じで、$hogeの配列にaaaがあるか判定します。あればtrue,なければfalseを返すようにしました。 今回では$hogeの配列は、 $hoge = ('85HCKP3sfL', 'XOF4msHVdd', 'ir10PRKDGp') このようになっており、aaaは存在しないためfalseがかえります。 if (in_array($category->category_name, $hoge)) { echo 'true'; } else { echo 'false'; } これならtrueが返ってきます。 in_arrayの使い道として、コントローラーからビューに変数を渡したときに、in_arrayで要素があればAのビューを読み込むみたいなことができるでしょう。 ※さらにis_nullも付け加えるといいでしょう。 if (!is_null($hoge) && in_array($category->category_name, $hoge)) { Aの画面 } else { Bの画面 } エンジニア・フリーランスにおすすめの転職サイト https://www.kamome-susume.com/enginner-job-change-site/
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【laravel-admin】deleteアクションをカスタマイズする

デフォルトのdeleteアクションだと特定の条件だけ削除したい場合や、条件によって確認メッセージを変えたい場合に対応できない。 リレーションを貼ってあるテーブルでリレーション元が消えちゃうとまずい場合とか。 そのためカスタマイズする必要がある。実際はカスタマイズじゃなく、オリジナルの削除処理を実装してそっちを使う。 カスタムアクションを作る php artisan admin:action Post\\Delete --grid-row --name="delete" 以下のディレクトリに作られる app/Admin/Actions/Post/Delete.php <?php namespace App\Admin\Actions\Post; use Carbon\Carbon; use Encore\Admin\Actions\RowAction; class Delete extends RowAction { public $name = 'delete'; public function handle() { // 削除処理 $this->row->delete(); return $this->response()->success('Delete Successful')->refresh(); } public function dialog() { $auths = $this->row->auths; $auths = $auths->filter(function($el){ $now = Carbon::now(); return $now < $el->auth_expired; }); if(empty($auths->toArray())) { $message = '削除しますか?'; } else { $message = '認証済みのようです。本当に削除しますか?'; } $this->confirm($message); } } postsテーブルにauthsテーブルが紐づいていて、認証済みだった場合にメッセージを切り替える例。 中身の処理は適宜変更してください。 完全に削除自体を禁止することも可能。 public function dialog() { ... } dialog() を使うと確認ダイアログが出せます。 こういうの↓ public function form() { $type = [ 1 => 'Advertising', 2 => 'Illegal', 3 => 'Fishing', ]; $this->checkbox('type', 'type')->options($type); $this->textarea('reason', 'reason')->rules('required'); } form() を使って何らかの入力や選択をさせることもできます。 AWSみたいに「削除」と文字列を送らないと削除させないとか。 作ったカスタムアクションを使うように設定 最後に作ったカスタムアクションを使用するように設定していきます。 合わせてデフォルトの削除アクションはdisabledに変更します。 <?php namespace App\Admin\Controllers; use App\Admin\Actions\Post\Delete; use Encore\Admin\Controllers\AdminController; use Encore\Admin\Form; use Encore\Admin\Grid; class PostController extends AdminController { ... /** * Make a grid builder. * * @return Grid */ protected function grid() { ... $grid->actions(function ($actions) { $actions->disableDelete(); // オリジナルの削除は非表示 $actions->add(new Delete); }); ... return $grid; } まとめ 結構自由度高くカスタムアクション作れるので、便利ですね。 通常はデフォルトで用意されているdeleteアクションを使えばいいと思いますが、特殊なケースではカスタムアクションを作っていけば問題なさそう。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel+vue.jsでFontAwesomeを使うメモ

はじめに Laravel8+Vue3でFont Awesomeを使用する際に 少し苦戦してしまったので 忘れないようにメモしておきます 開発環境は DockerでLaravel vue.jsの環境を構築してます FontAwesomeをインストールする プロジェクトに移動して FontAwesomeをインストールします $ npm install --save @fortawesome/fontawesome-svg-core $ npm install --save @fortawesome/free-solid-svg-icons #Using Vue 3.x $ npm install --save @fortawesome/vue-fontawesome@prerelease 上記にもあるのですが vue 3.x ~はvue-fontawesomeの後ろに@prerelease(事前公開)が付くみたいです vue 2.x ~は@latest (最新)をつけるみたいです インストールし終わったら package.jsonを見に行って インストールしたものがあるかチェックしておきましょう "@fortawesome/fontawesome-svg-core": "^1.2.36" "@fortawesome/free-brands-svg-icons": "^5.15.4" "@fortawesome/vue-fontawesome": "^3.0.0-4" 実際に使用する インストールが終わったのであとは使用するだけです! 今回はこいつを使いましょう https://fontawesome.com/v5.15/icons/angle-right?style=solid よく見るやつです まず、表示したいvueファイルのscript内で <script> import { library } from "@fortawesome/fontawesome-svg-core"; import { faAngleRight } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/vue-fontawesome"; library.add(faAngleRight); export default { components: { FontAwesomeIcon, }, </script> 上記のようにimportとexport をしてあげます library.addでは使いたいアイコンを追加する。(使用する宣言をしてあげます) 今回の場合はfaAngleRightを使用すると宣言します。 また、アイコンを追加する際は fa-angle-righ のように ハイフンで繋げてあるケバブケースから faAngleRight のように キャメルケースにして使用してください! script 内の記述が終わったので 次はtemplateです <template> <FontAwesomeIcon icon="angle-right" /> </template> 上記のように使いたい箇所に記載すれば アイコンが使用できます! またしてもここで注意が必要なのですが icon="" の中身は angle-rightのように  ケバブケースにしてあげないと動きません! 少し面倒ですがお忘れなく!! 以上 自分のメモ用に記載しました。 間違い等ありましたら 優しくご指摘くださいませ。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel blade + vue.js でユーザー入力に対応する

きっかけ Laravel blade + vue.js という環境でユーザーの入力を扱う際にいろいろ苦戦したので、備忘録として記載します。 blade 記法で値を置くと コントローラから渡したデータを blade 記法で書く際はすぐに以下の記載を行うと思います。 {{ $var }} 一般的なデータについてはこの入力で渡せるので良いと思いますが、もしこのデータ自体がユーザー入力等で{{ 何らかの入力 }}を含んでいる場合、 blade テンプレートのレンダリング vue.js のコンパイル 画面の表示 という順序の内、1 番目の blade のレンダリング後にユーザーが入力した{{ 何らかの入力 }}がページソース上に載った状態で 2 番目のレンダリングに回されます。 この際、2 番目のコンパイルで vue.js 側は真面目に{{ 何らかの入力 }}の中身を解釈しようとするので、大抵の場合はコンパイル時のエラーが出ることになります。 回避方法1 データを置く部分の親要素にv-preを付ける。 例 <div v-pre> {{ $var }} </div> 用途:ユーザーの入力をただ表示するだけの場合 (内容を確認する画面等) v-preはついている要素とその子要素のコンパイルをスキップするものであり、結果的に子要素であるユーザー入力内の{{ 何らかの入力 }}のコンパイルもスキップされ、表示できるようになります。 回避方法2 script 内でデータを渡し、vue.js の data から参照する。 <textarea v-model="message"></textarea> (中略) var app = new Vue({ el: '#app', data: { message: {{ $var }} } }) 用途:ユーザーの入力を vue.js 側でも利用する場合。 (input や textarea などの入力が絡む場合) 実際の入力部分にv-preを付けると、入力された内容に対しての vue.js の一切の処理が行えない状況になります。 入力内容に対して何らかの vue.js の処理を行う場合、blade 記法で入力部分にデータを渡すのは諦めて、vue.js の data に blade 記法で渡す必要があります。 この際、実際には、改行を含む際の対応や vue.js の data から参照する際の記法など、javascript, vue.js, html 間のお約束に沿った書き方に気を付ける必要があります。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravelでイベントを用いてメールを送信する

概要 Laravelのイベントとリスナーを使って、フォームからの問い合わせが来たときに、通知メールを送信する処理を実装します。 実行環境 上記の記事を参考に、GitHubのテンプレートリポジトリから環境を構築しています。 Laravel6.* 実装の大まかな流れ 環境変数にメール送信に必要な情報を設定 メール送信用クラスの作成 メールのViewを作成 イベントの作成 リスナーの作成 イベントとリスナーを紐づけ イベントの発行 環境変数(.env)に必要情報を設定 .env MAIL_DRIVER=smtp MAIL_HOST=XXXXX.jp //サーバのドメイン名やIPアドレス MAIL_PORT=587 //ポート番号は各環境に依存 MAIL_USERNAME=XXXXX@XXXXX.co.jp //メールで利用するユーザ名 MAIL_PASSWORD=XXXXX //メールで利用するパスワード MAIL_ENCRYPTION=null MAIL_FROM_ADDRESS=XXXXX@XXXXX.co.jp //メールの送信元アドレス ACCEPT_MAIL_ADDRESS=XXXXX@XXXXX.co.jp // メールの送信先アドレス \config\app.php <?php return [ 'aliases' => [ // 省略 ], // 問い合わせ用メールアドレスを設定 'mail_from_address' => env('MAIL_FROM_ADDRESS'), 'accept_mail_address' => env('ACCEPT_MAIL_ADDRESS'), ]; メール送信用クラスの作成 app\Mail配下にContactMail.phpを作成 $ php artisan make:mail ContactMail メール送信用クラスの編集 ContactMail.php <?php namespace App\Mail; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Mail\Mailable; use Illuminate\Queue\SerializesModels; class ContactMail extends Mailable { use Queueable, SerializesModels;   // 追記 private $contact; /** * Create a new message instance. * * @return void */ public function __construct($contact) // コンストラクタの引数で値を受け取る { // ContactMailクラスのprivate変数に引数の値を代入 $this->contact = $contact; } /** * Build the message. * * @return $this */ public function build() { return $this ->from(config('app.mail_from_address')) // 送信元のメールアドレスを指定 ->subject('お問い合わせ完了のご連絡') // メールの件名 ->view('emails.contact_mail') // どのテンプレートを呼び出すか ->with(['contact' => $this->contact]); // withオプションでセットしたデータをテンプレートへ受け渡す } } メール送信用のViewを作成 resources\views配下にemailsフォルダを作成 $ mkdir emails フォルダ作成後、resources\views\emails配下に、contact_mail.blade.phpを作成 メール送信のViewを編集 contact_mail.blade.php <html> <head> <title>sample</title> </head> <body> メール送信しました </body> </html> イベントの作成 app\Events配下にContactRequestCompleted.phpを作成 $ php artisan make:event ContactRequestCompleted イベントの編集 イベントのコンストラクタを修正 イベント発火時に必要な情報をコンストラクタで渡しておく。 ContactRequestCompleted.php class ContactRequestCompleted { use Dispatchable, InteractsWithSockets, SerializesModels;   // 追記 public $contact; /** * Create a new event instance. * * @return void */ public function __construct($post) // コンストラクタの引数でフォームから値を受け取る { // ContactRequestCompletedクラスのpublic変数に引数の値を代入 $this->contact = $post; } /** * Get the channels the event should broadcast on. * * @return \Illuminate\Broadcasting\Channel|array */ public function broadcastOn() { return new PrivateChannel('channel-name'); } } リスナーの作成 app\Listeners配下にSendContactRequestEmail.phpを作成 $ php artisan make:listener SendContactRequestEmail リスナーの編集 SendContactRequestEmail内のhandleメソッドを修正 handleメソッド内に、メール送信などの具体的な処理を追加する。 SendContactRequestEmail.php <?php namespace App\Listeners; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Queue\InteractsWithQueue; use Mail; use App\Mail\ContactMail; class SendContactRequestEmail { /** * Create the event listener. * * @return void */ public function __construct() { // } /** * Handle the event. * * @param object $event * @return void */ public function handle($event) { // メールの送信先アドレスに、.envで指定したACCEPT_MAIL_ADDRESSの値を代入 $to_address_admin = config('app.accept_mail_address'); // 送信先アドレスにメールを送信 Mail::to($to_address_admin)->send(new ContactMail($event->contact)); } } イベントとリスナーを紐づけ Providers\EventServiceProvider.phpを編集 EventServiceProvider.php <?php namespace App\Providers; use Illuminate\Auth\Events\Registered; use Illuminate\Auth\Listeners\SendEmailVerificationNotification; use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider; use Illuminate\Support\Facades\Event; use App\Events\ContactRequestCompleted; use App\Listeners\SendContactRequestEmail; class EventServiceProvider extends ServiceProvider { /** * The event listener mappings for the application. * * @var array */ protected $listen = [ Registered::class => [ SendEmailVerificationNotification::class, ], // 作成したイベントと紐付けたいリスナーを追記 ContactRequestCompleted::class => [ SendContactRequestEmail::class, ], ]; /** * Register any events for your application. * * @return void */ public function boot() { parent::boot(); // } } イベントの発行 コントローラー等にイベントの発行処理を追加 SampleController.php use App\Events\ContactRequestCompleted; class SampleController extends Controller { // イベントの発火処理(引数で値渡しが可能) event(new ContactRequestCompleted($post)); }
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel5.5を8.58にアップグレードした際の手順メモ

PHP のWebアプリケーションフレームワーク Laravel を最新バージョンに更新しました。 次回また必要になったときの、ほぼ個人的なメモなので解説はありません。環境に合わせて読み替えて下さい。 環境 Red Hat Enterprise Linux のリビルド版だった CentOS のサポート終了に伴い、Laravel移行と同じタイミングで Ubuntu に乗り換えています。 旧環境 $ cat /etc/redhat-release CentOS Linux release 7.6.1810 (Core) $ php -v PHP 7.2.3 (cli) (built: Feb 28 2018 08:39:13) ( NTS ) Copyright (c) 1997-2018 The PHP Group Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies $ php artisan --version Laravel Framework 5.5.50 新環境 $ cat /etc/os-release VERSION="20.04.3 LTS (Focal Fossa)" $ php -v PHP 7.4.3 (cli) (built: Jul 5 2021 15:13:35) ( NTS ) Copyright (c) The PHP Group Zend Engine v3.4.0, Copyright (c) Zend Technologies with Zend OPcache v7.4.3, Copyright (c), by Zend Technologies $ php artisan --version Laravel Framework 8.58.0 手順 一般的には、composer.json を編集し composer updateコマンドで更新という手順になると思いますが、バージョンが開き過ぎているので、最新の Laravel を新規インストールし、旧プロジェクトファイルを手作業でマージしていくことにしました。 composer で Laravel をインストール cd /var/www/html composer create-project laravel/laravel [プロジェクト名] cd [プロジェクト名] chown -R www-data:www-data . find . -type d -exec chmod 770 {} \; find . -type f -exec chmod 660 {} \; chmod -R 777 ./storage ./bootstrap/cache validation.php 言語ファイルの日本語化 php -r "copy('https://readouble.com/laravel/8.x/ja/install-ja-lang-files.php', 'install-ja-lang.php');" php -f install-ja-lang.php php -r "unlink('install-ja-lang.php');" Laravel Fortify のインストール composer require laravel/fortify php artisan vendor:publish --provider="Laravel\Fortify\FortifyServiceProvider" config/app.php 'providers' => [ App\Providers\FortifyServiceProvider::class, // 追加 config/fortify.php return [ 'username' => 'user_id', // 必要に応じて修正 : // 必要に応じてコメントアウト 'features' => [ Features::registration(), Features::resetPasswords(), //Features::emailVerification(), //Features::updateProfileInformation(), //Features::updatePasswords(), //Features::twoFactorAuthentication([ // 'confirmPassword' => true, //]), ], config の下を編集した場合は php artisan config:clear を忘れずに。 app/Providers/FortifyServiceProvider.php public function boot() { : Fortify::viewPrefix('auth.'); // 追加 app/Providers/RouteServiceProvider.php //public const HOME = '/home'; public const HOME = '/xxxxx'; // 必要に応じて修正 protected $namespace = 'App\\Http\\Controllers'; // コメントアウトを外す Laravel Debugbar のインストール composer require barryvdh/laravel-debugbar php artisan vendor:publish --provider="Barryvdh\Debugbar\ServiceProvider" データベース設定 $ mysql -u root CREATE DATABASE [データベース名]; CREATE USER '[ユーザ名]'@'localhost' IDENTIFIED BY '[パスワード]'; GRANT ALL PRIVILEGES ON [データベース名].* TO '[ユーザ名]'@'localhost'; FLUSH PRIVILEGES; .env DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=[データベース名] DB_USERNAME=[ユーザ名] DB_PASSWORD=[パスワード] Apache設定 /etc/apache2/sites-available/virtual-host.conf Alias /[プロジェクト名] /var/www/html/[プロジェクト名]/public <Directory "/var/www/html/[プロジェクト名]/public"> AllowOverride All Require all granted </Directory> /var/www/html/[プロジェクト名]/public/.htaccess RewriteBase /[プロジェクト名] Apache の再起動 apache2ctl configtest systemctl restart apache2 ルーティング設定 routes/web.php Route::get('/', function () { //return view('welcome'); return view('auth.login'); // 必要に応じて修正 }); Route::group(['middleware' => 'auth'], function () { 最後に、コントローラやビュー、モデルの他、個別に修正していたファイルがあればマージして完成です。 モデルは\App\Modelsに置くのがデフォルトになりました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

laravel5.5で、Authを使ったログイン時アクセスしたい画面にリダイレクトする方法

さっと書きます。 今回実装したいのは、 ログインが必要なページにアクセスした際ログイン画面にリダイレクト ↓ ログイン ↓ アクセスした元のURLにリダイレクトされる といった簡単な内容です。 すぐ答えです。以下です。 Laravel 5.5の場合、LoginController.phpを更新するだけで次のコードが機能しました public function showLoginForm() { session(['link' => url()->previous()]); return view('auth.login'); } protected function authenticated(Request $request, $user) { return redirect(session('link')); } セッションに残して、それにリダイレクトさせる簡単なコードで実装できました。 参考文献 https://www.it-mure.jp.net/ja/php/laravel-5%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E5%BE%8C%E3%80%81%E5%89%8D%E3%81%AE%E3%83%9A%E3%83%BC%E3%82%B8%E3%81%AB%E3%83%AA%E3%83%80%E3%82%A4%E3%83%AC%E3%82%AF%E3%83%88/1052037127/amp/ 上記には多数のバージョンがあるので、見てみてくださいねん。 以上
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む