20210430のPHPに関する記事は9件です。

Laravelのゲートを使用してみた

Laravelには認証に加えて認可も手軽に実装できる方法を提供しています。Laravelの認可には「ゲート」と「ポリシー」の2つが用意されています。今回は「ゲート」を利用して特定のユーザーのアクションを制御しみます。 ゲートを利用するために、認証と必要なデータを用意するには下記の記事がおすすめです。 ゲートの作成 App\Providers\AuthServiceProviderクラスに処理を追加します。例では、各記事の更新ページは、ログインしているユーザーが作成したページのみ表示できるようにしています。 app/Providers/AuthServiceProvider.php namespace App\Providers; use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider; use Illuminate\Support\Facades\Gate; use App\Models\Article; use App\Models\User; class AuthServiceProvider extends ServiceProvider { /** * The policy mappings for the application. * * @var array */ protected $policies = [ // 'App\Models\Model' => 'App\Policies\ModelPolicy', ]; /** * Register any authentication / authorization services. * * @return void */ public function boot() { $this->registerPolicies(); Gate::define('update-article', function (User $user, Article $article) { return $user->id === $article->user_id; }); } } 厳密な型の比較でusersテーブルのidとarticlesテーブルのuser_idを比較しています。ここで少しハマりポイントなのですが、articlesテーブルのuser_idをint型で定義していてもmodelではstringとして扱われてしまうので、この比較ではすべてfalseが返ってしまします。ですので、型をあわせるためにarticleモデルのほうでuser_idをintにキャストします。 app/Models/Article.php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Article extends Model { use HasFactory; protected $guard = ['id']; protected $casts = [ 'user_id' => 'integer' ]; } ゲートの利用 AuthServiceProviderで定義したゲートを利用してアクションを認可してみます。ArticlesControllerからゲート認可メソッドを呼び出して、認証済みユーザーが自身が作成したページ以外の記事更新ページをリクエストしたら403を返すようにします。 app/Http/Controllers/ArticlesController.php namespace App\Http\Controllers; use App\Models\Article; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Gate; class ArticlesController extends Controller { // 更新メソッドなど public function edit(Article $article) { if (! Gate::allows('update-article', $article)) { abort(403); } return view('articles.edit', ['article' => $article]); } } 特定のユーザーにはすべてのページを見れるようにする 例えば、一般ユーザーは自身が作成したページのみしか更新できないようにして、管理者はすべてのページを更新可能にしたいことがあるかと思います。「ゲートチェックの割り込み」を利用することによってこの機能を実現できるようになります。ゲートチェックの割り込みはすべての認可メソッドの前後に挟むことができます。今回はすべての認可メソッドの前に割り込みし、「admin」ロールが付与されたユーザーはすべての更新ページを見れるようにします。 usersテーブルにroleカラムを追加 まずはmigrationを利用してusersテーブルにroleカラムを追加します。usersテーブルを作成するマイグレーションファイルはlaravelのインストール時に含まれているので、カラム追加用のマイグレーションファイルを用意します。 php artisan make:migration add_role_to_users_table --table=users マイグレーションファイル xxxx_xx_xx_xxxxxx_add_role_to_users_table.php <?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; class AddRoleToUsersTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::table('users', function (Blueprint $table) { $table->string('role', 16) ->after('password') ->default('user'); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::table('users', function (Blueprint $table) { $table->dropColumn('role'); }); } } 作成したマイグレーションファイルを実行します。 php artisan migrate usersテーブルにroleカラムが追加されました。任意のユーザーのroleをadminに変更します。 UPDATE users SET role='admin' WHERE id=3 これで一般ユーザーと管理者ユーザーが作成できました。 割り込み処理を追加 Gateファサードのbeforeメソッドを使用することで、すべての認可チェックの前に特定の処理を実行できます。今回は認証済みユーザーのroleがadminの場合にアクションを許可するようにします。 app/Providers/AuthServiceProvider namespace App\Providers; use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider; use Illuminate\Support\Facades\Gate; use App\Models\Article; use App\Models\User; class AuthServiceProvider extends ServiceProvider { /** * The policy mappings for the application. * * @var array */ protected $policies = [ // 'App\Models\Model' => 'App\Policies\ModelPolicy', ]; /** * Register any authentication / authorization services. * * @return void */ public function boot() { $this->registerPolicies(); Gate::before(function ($user, $ability) { if ($user->role === 'admin') { return true; } }); Gate::define('update-article', function (User $user, Article $article) { return $user->id === $article->user_id; }); } } これによって、adminロールが付与されたユーザーは自身が作成したページ以外のページも見れるようになります。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravelで簡単なCMSを作成(一覧と記事登録ページ)

CakePHPにはチュートリアルとして公式にコンテンツ管理チュートリアルが用意されていますが、Laravelにはそもそもチュートリアルが用意されていない?のでCakePHPのチュートリアルをLaravelで自分なりにアレンジしてみたいと思います。 MVCを作成 Model, View, Controllerを作成していきます。 Controllerを作成 artisanコマンドでControllerのひな形を作成します。 php artisan make:controller ArticlesController 作成したファイルに肉付けします。 app/Http/Controllers/ArticlesController.php <?php namespace App\Http\Controllers; use App\Models\Article; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Gate; class ArticlesController extends Controller { public function index() { $articles = Article::all(); return view('articles.index', ['articles' => $articles]); } public function add() { return view('articles.add'); } public function create(Request $request) { $article = Article::create([ 'title' => $request->title, 'body' => $request->body, 'user_id' => Auth::id(), 'slug' => $request->title, ]); return redirect('/articles'); } } Modelを作成 Controllerと同様にartisanコマンドでひな形を作成して肉付けします。 php artisan make:model Article app/Models/Article.php <?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Article extends Model { use HasFactory; protected $fillable = [ 'title', 'body', 'slug', 'user_id', ]; } Viewを作成 resources/views/articlesディレクトを作成して、一覧・登録ページを用意します。Laravel Breezeはビュー層にTailwind CSSを使用しているのでhtmlのclassにはこれを利用してます。 resources/views/articles/add.blade.php <x-app-layout> <x-slot name="header"> <h2 class="font-semibold text-xl text-gray-800 leading-tight"> {{ __('Articles') }} </h2> </x-slot> <div class="py-12"> <div class="max-w-7xl mx-auto sm:px-6 lg:px-8"> <div class="bg-white overflow-hidden shadow-sm sm:rounded-lg"> <div class="p-6 bg-white border-b border-gray-200"> <form action="add" method="post"> @csrf <div class="grid grid-cols-1 gap-6"> <label class="block"> <span class="text-gray-700">Title</span> <input type="text" name="title" class="mt-1 block w-full"> </label> <label class="block"> <span class="text-gray-700">Body</span> <textarea class="mt-1 block w-full" rows="3" name="body"></textarea> </label> <input type="submit" class="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded focus:outline-none focus:shadow-outline" value="send"> </div> </form> </div> </div> </div> </div> </x-app-layout> 一覧ページを用意します。 resources/views/articles/index.blade.php <x-app-layout> <x-slot name="header"> <h2 class="font-semibold text-xl text-gray-800 leading-tight"> {{ __('Articles') }} </h2> </x-slot> <div class="py-12"> <div class="max-w-7xl mx-auto sm:px-6 lg:px-8"> <div class="bg-white overflow-hidden shadow-sm sm:rounded-lg"> <div class="p-6 bg-white border-b border-gray-200"> <table class="table-auto"> <thead> <tr> <th>Title</th> <th>Author</th> <th>Updated</th> </tr> </thead> <tbody> @foreach($articles as $article) <tr> <td>{{$article->title}}</td> <td>{{$article->user_id}}</td> <td>{{$article->updated_at}}</td> </tr> @endforeach </tbody> </table> </div> </div> </div> </div> </x-app-layout> ルートを登録 一覧・作成ページを表示させるために、web.phpにルーティングを定義します。 routes/web.php <?php use Illuminate\Support\Facades\Route; /* |-------------------------------------------------------------------------- | Web Routes |-------------------------------------------------------------------------- | | Here is where you can register web routes for your application. These | routes are loaded by the RouteServiceProvider within a group which | contains the "web" middleware group. Now create something great! | */ Route::get('/', function () { return view('welcome'); }); Route::get('/dashboard', function () { return view('dashboard'); })->middleware(['auth'])->name('dashboard'); Route::get('/articles', 'App\Http\Controllers\ArticlesController@index'); Route::get('/article/add', 'App\Http\Controllers\ArticlesController@add'); Route::post('/article/add', 'App\Http\Controllers\ArticlesController@create'); require __DIR__.'/auth.php'; 作成したリソースは以下になります。 メソッド URI アクション GET /articles 一覧 GET /article/add 記事登録ページ表示 POST /article/add 記事登録 GET /article/edit/{article} 記事更新ページ表示 POST /article/edit/{article} 記事登録
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravelで簡単なCMSを作成(記事管理ページ編)

CakePHPにはチュートリアルとして公式にコンテンツ管理チュートリアルが用意されていますが、Laravelにはそもそもチュートリアルが用意されていない?のでCakePHPのチュートリアルをLaravelで自分なりにアレンジしてみたいと思います。 環境 Laravel: 8.x php: 7.3 スターターキットで認証機能を作成 素晴らしいことにLaravelには認証機能をサクッとつくれるようにスターターキットが用意されています。Laravel breezeを使用してシンプルな認証機能を作成します。 // パッケージをインストール composer require laravel/breeze --dev php artisan breeze:install npm install npm run dev php artisan migrate 上記のコマンドを実行するだけで、/loginにログイン画面が表示されます。ユーザーを登録するためには、/registerにアクセスします。 テーブル作成 テーブル構成・定義はCakePHPのチュートリアルで紹介されているものを拝借し、3つテーブルを作成します。 php artisan make:migration create_articles_table php artisan make:migration create_tags_table php artisan make:migration create_article_tag_table create_articles_table <?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; class CreateArticlesTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('articles', function (Blueprint $table) { $table->id(); $table->integer('user_id'); $table->string('title', 255); $table->string('slug', 191); $table->text('body'); $table->boolean('published')->default(false); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('articles'); } } create_tags_table <?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; class CreateTagsTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('tags', function (Blueprint $table) { $table->id(); $table->string('title', 191); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('tags'); } } create_article_tag_table <?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; class CreateArticleTagTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('article_tag', function (Blueprint $table) { $table->integer('article_id'); $table->integer('tag_id'); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('article_tag'); } } マイグレーションファイルを実行したら、artisanコマンドで実行します。 php artisan migrate MVCを作成 ここからはMVCのリソースを作成していきます。 Controllerを作成 artisanコマンドでControllerの雛形を作成します。 php artisan make:controller ArticlesController 作成したファイルに肉付けします。 app/Http/Controllers/ArticlesController.php <?php namespace App\Http\Controllers; use App\Models\Article; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Gate; class ArticlesController extends Controller { public function index() { $articles = Article::all(); return view('articles.index', ['articles' => $articles]); } public function add() { return view('articles.add'); } public function create(Request $request) { $article = Article::create([ 'title' => $request->title, 'body' => $request->body, 'user_id' => Auth::id(), 'slug' => $request->title, ]); return redirect('/articles'); } public function edit(Article $article) { return view('articles.edit', ['article' => $article]); } public function update(Request $request, Article $article) { $article->fill($request->all())->save(); return redirect('/articles'); } } Modelを作成 Controllerと同様にartisanコマンドでひな形を作成して肉付けします。 php artisan make:model Article app/Models/Article.php <?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Article extends Model { use HasFactory; protected $fillable = [ 'title', 'body', 'slug', 'user_id', ]; } Viewを作成 resources/views/articlesディレクトを作成して、各リソースに対応するページを用意します。Laravel Breezeはビュー層にTailwind CSSを使用しているのでhtmlのclassにはこれを利用してます。 resources/views/articles/add.blade.php <x-app-layout> <x-slot name="header"> <h2 class="font-semibold text-xl text-gray-800 leading-tight"> {{ __('Articles') }} </h2> </x-slot> <div class="py-12"> <div class="max-w-7xl mx-auto sm:px-6 lg:px-8"> <div class="bg-white overflow-hidden shadow-sm sm:rounded-lg"> <div class="p-6 bg-white border-b border-gray-200"> <form action="add" method="post"> @csrf <div class="grid grid-cols-1 gap-6"> <label class="block"> <span class="text-gray-700">Title</span> <input type="text" name="title" class="mt-1 block w-full"> </label> <label class="block"> <span class="text-gray-700">Body</span> <textarea class="mt-1 block w-full" rows="3" name="body"></textarea> </label> <input type="submit" class="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded focus:outline-none focus:shadow-outline" value="send"> </div> </form> </div> </div> </div> </div> </x-app-layout> resources/views/articles/edit.blade.php <x-app-layout> <x-slot name="header"> <h2 class="font-semibold text-xl text-gray-800 leading-tight"> {{ __('Articles') }} </h2> </x-slot> <div class="py-12"> <div class="max-w-7xl mx-auto sm:px-6 lg:px-8"> <div class="bg-white overflow-hidden shadow-sm sm:rounded-lg"> <div class="p-6 bg-white border-b border-gray-200"> <form action="/article/update/{{$article->id}}" method="post"> @csrf <div class="grid grid-cols-1 gap-6"> <label class="block"> <span class="text-gray-700">Title</span> <input type="text" name="title" class="mt-1 block w-full" value="{{$article->title}}"> </label> <label class="block"> <span class="text-gray-700">Body</span> <textarea class="mt-1 block w-full" rows="3" name="body">{{$article->body}}</textarea> </label> <input type="submit" class="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded focus:outline-none focus:shadow-outline" value="send"> </div> </form> </div> </div> </div> </div> </x-app-layout> resources/views/articles/index.blade.php <x-app-layout> <x-slot name="header"> <h2 class="font-semibold text-xl text-gray-800 leading-tight"> {{ __('Articles') }} </h2> </x-slot> <div class="py-12"> <div class="max-w-7xl mx-auto sm:px-6 lg:px-8"> <div class="bg-white overflow-hidden shadow-sm sm:rounded-lg"> <div class="p-6 bg-white border-b border-gray-200"> <table class="table-auto"> <thead> <tr> <th>Title</th> <th>Author</th> <th>Updated</th> </tr> </thead> <tbody> @foreach($articles as $article) <tr> <td>{{$article->title}}</td> <td>{{$article->user_id}}</td> <td>{{$article->updated_at}}</td> </tr> @endforeach </tbody> </table> </div> </div> </div> </div> </x-app-layout> ルートを登録 一覧・作成・更新ページを表示させるために、web.phpにルーティングを定義します。 routes/web.php <?php use Illuminate\Support\Facades\Route; /* |-------------------------------------------------------------------------- | Web Routes |-------------------------------------------------------------------------- | | Here is where you can register web routes for your application. These | routes are loaded by the RouteServiceProvider within a group which | contains the "web" middleware group. Now create something great! | */ Route::get('/', function () { return view('welcome'); }); Route::get('/dashboard', function () { return view('dashboard'); })->middleware(['auth'])->name('dashboard'); Route::get('/article/edit/{article}', 'App\Http\Controllers\ArticlesController@edit'); Route::post('/article/update/{article}', 'App\Http\Controllers\ArticlesController@update'); Route::get('/articles', 'App\Http\Controllers\ArticlesController@index'); Route::get('/article/add', 'App\Http\Controllers\ArticlesController@add'); Route::post('/article/add', 'App\Http\Controllers\ArticlesController@create'); require __DIR__.'/auth.php'; これで一覧ページは/articles、更新ページは/article/edit/{articlesテーブルのid}、追加は/article/addで見ることができます。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【PHP】API実行ツールを作ってみよう(その3)

はじめに PHPでツール作成の5回目です。 前回のAPI実行ツールでは主にテキストデータ(クエリパラメータ)の送受信を行いましたが、 今回は添付ファイルを用いた送受信ツールを作成したいと思います。 クライアント クライアント側はツール作成の1回目で使用した Chrome拡張機能のTalend API Tester を使用します。 インストール方法や基本的な使い方などは1回目の記事を参照下さい。 1.以下のようなファイルを作成します(CSV形式) 2.Talend APIの設定を以下のように行います。 ①POSTを選択します ②アクセスするURLを指定します ■http://localhost/api_temp/server.php?fname=test.csv ③送信データを指定します ■今回はファイルをアップロードするので、「Text」→「File」に変更します ④アップロードするファイルをドラッグ&ドロップします ⑤送信ボタンを押します サーバ クライアントの準備は出来たので、続いてサーバ側を作成していきます。 1.「c:¥xampp¥htdocs」フォルダに「api_temp」フォルダを作成します 2.上記のフォルダ内に「file」フォルダを作成します 3.「api」フォルダ内に「server.php」ファイルを作成します 中身は下記になります server.php <?php $saveFolderName = "./file"; // リクエストパラメータチェック if( !isset($_GET['fname']) ){ echo "エラー:リクエストパラメータにファイル名が指定されていません。"; return; } $fname = $_GET['fname']; // ファイル名拡張子チェック $fileNames = explode( ".", $fname ); if( count($fileNames) <= 1 ){ echo "エラー:リクエストパラメータにファイル名が指定されていません。"; return; } $extName = $fileNames[1]; if( $extName != 'csv' ){ echo "エラー:ファイル名の拡張子が不正です。"; return; } // ファイル保存 $params = file_get_contents('php://input'); if( strlen($params) <= 0 ){ echo "エラー:ファイルが不正です。"; return; } $outputFile = "".$saveFolderName."/".date("Y-m-d_His")."_".substr(explode(".", (microtime(true) . ""))[1], 0, 3).".".$extName.""; file_put_contents( $outputFile, $params ); // レスポンス echo "Success"; ?> コード解説 5~22行目・・クライアントからのリクエストデータのエラーチェックを行っています。 24~32行目・・クライアントからの送信データを取得し、ファイルへ保存しています。 34~35行目・・クライアントへレスポンスを返しています。 クライアント動作確認 ・「Send」ボタン押下後、画面下のResponseに「200 OK」が表示されていて、 右下の「BODY」に「Success」と表示されていれば成功しています サーバ動作確認 1.実行日時のファイル名でCSVファイルが作成されていることを確認 2.CSVファイルを開き、クライアントから送られたファイル内容と一致していることを確認 最後に 実際の業務では今回のようなファイルがAPI経由で送られてきて、その内容を保存するといったことが結構あるかと思います。 またファイル送信は別会社が担当し、自分はデータ受信(今回のPHP側の部分)を担当するといったケースも良くあるので、 特にエラーチェック(ファイル名、ファイル形式、データの中身など)は厳密にし、エラーが発生した際にどちら側に原因があるのか?を特定し易くしておくと良いと思います。 次回は、クライアント部分をPHPを使って作成したいと思います。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Composerコマンドまとめ

はじめに PHPで開発をしていたら使うであろう Composer についてまとめました。 目次 前提知識 Composer composer.json composer.lock コマンド composer init composer install composer update composer require composer remove オプション 参考文献 前提知識 前提知識として以下のことを理解する必要があります。 Composer 依存関係にあるライブラリ( パッケージ )を管理してくれるツール のこと。 composer.json プロジェクトで使用されているパッケージを定義している。 composer.lock 依存するパッケージのリストが記載されていて、バージョンをロックしている。 コマンド "composer init" composer init 「composer.json」 を生成するために使用するコマンド。 プロジェクトの一番はじめに使用するものなので使用頻度はあまり高くありません。 "composer install" composer install 「composer.lock」 に書いてある内容を読み依存関係をインストールする。 composer init コマンド直後( 初回 )は 「composer.lock」 が生成されていないはずなので 「composer.json」 の内容が読まれ「composer.lock」 が生成される。 初回は install コマンドを使い二回目以降は update コマンドを使用する。 ※ 新しいパッケージを導入するときは別コマンド( composer.update か composer require )を使用します。 "composer update" composer update 「composer.json」 の内容をもとに update( 更新 ) する。 注意が必要で 「composer.lock」 の内容も update されるということ。複数人で開発していると、パッケージのバージョンに差異が出て開発した機能にバグが出てしまう恐れがある。 これを防ぐためにも update を使用するときは確認をリーダーに確認を取る、もしくは、パッケージを追加するときは require コマンドを使用すると良いかもしれない。(あくまで個人的見解なのでチームのルールがあれば従ってください) "composer require" composer require [パッケージ名] # 例えば # PHPMDを追加 composer require "phpmd/phpmd=@stable" パッケージを追加したいときに使用するコマンド。 "composer remove" composer remove [パッケージ名] # 例えば # PHPMDを削除 composer remove "phpmd/phpmd" パッケージの削除をしたいときに使用するコマンド。 オプション コマンドの最後に --dev をつけると 「composer.json」 の "require-dev" に読み込ませたり追加できたりすることができる。"require-dev" とは開発環境で使用している使用したいパッケージが定義されているということ。 他にもオプションはあるのでドキュメントを一度は覗いてみるとよいかもしれません。 参考文献 composer install Composerの使い方 composer install と composer updateの違い composer.json と composer.lock、install と update の違い
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PHP class useのasについて

名前空間のuseのasについて検証した。 名前空間についての基礎はこちら class 基本 名前空間 執筆のきっかけ cakephpを触っているとよく namespace App\Model\Entity; use Cake\ORM\Entity; class hoge() { } といった内容を見かけます。 あれ、useってasで別名(エイリアス)つけるんじゃ、、、 そう思って調べてみました。 useのasは省略出来る 以下の記事にまとまっていました 参考:https://remotestance.com/blog/3064/ そもそも名前空間とは たくさんのファイルがあって、同名のクラスが重複されて使用されている場合、requierなどで別ファイルを読み取ってクラスを使用した時に、クラス名が重複する場合がある。 そういった時に名前空間を使用すればクラスを呼び出す際に重複を防げる 実際のコードで見てみる(それぞれのコードは同一のルート上にある装丁です) 例1) [use.php] <?php namespace person\think\like1; class like { public function music(){ echo 'bz'."\n"; } } [use2.php] <?php namespace person\think\like2; class like { public function music(){ echo 'Tokio'."\n"; } } [use3.php] <?php require_once 'use.php'; require_once 'use2.php'; use person\think\like1; //use person\think\like1 as like1;と同じ意味 use person\think\like2; //use person\think\like1 as like2;と同じ意味 $like1 = new like1\like(); $like1->music(); //bz $like2 = new like2\like(); $like2->music(); //Tokio 上記の例はuse.php, use2.phpでそれぞれ同名のクラスlikeを定義している。 use3.phpでそれぞれのファイルを読み込んだ後、クラスlikeを呼び出している。 上記例でもしnamespaceの記述がuse.php, use2.phpでなければ、use3.phpで呼び出した際に「エラーが出る or echoの結果が表示されない」となる。 useのasについて use3.phpのようにクラスを呼び出して使用したいファイルではuseを使用することで、クラスを呼び出す際の記述を簡潔に書ける。 asを使用することで呼び出すと時の名前を自由に設定できる。 例えば上記例ではasを使用していませんが 例2) [use3.php] use person\think\like1 as bz; use person\think\like2 as Tokio; $like1 = new bz\like(); $like1->music(); //bz $like2 = new Tokio\like(); $like2->music(); //Tokio のように使用出来ます。 結局as使うのと使わないのって何が違うの? 上記までの説明を踏まえると asはuseを使用する際に自由に名前(エイリアス)をつける時に使用するが、特に必要がなければasを書かず 以下の例1のように 例1抜粋 use person\think\like1; use person\think\like2; $like1 = new like1\like(); $like1->music(); //bz $like2 = new like2\like(); $like2->music(); //Tokio like1, like2を例2のようにbzやTokioという名前の代わりにそのまま使用出来るのでより簡潔に書けます。 まとめ asを使用するしないはどちらでも良いと思いますが、asは省略出来るということを押さえておくとフレームワークを使用する際に理解が進むと思います。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

LaravelでAjaxを実装する場合のリンク集

はじめに LaravelでAjaxを実装する際に、良いチュートリアルが存在せず、 Laravel内での解決方法もあまりなかったので、実装方法を別途探りました。 結論から言うと、Laravel内ではView/BladeでAjax用の機能を提供していないので、 jQuery等のJavaScriptのライブラリを組み込んでAjax部分は別途実装する必要あります。 その時に調べた情報のリンク集としてまとめました。 コードとかは気が向いたら、別途記事にする予定です。 参考 Laravel7 ajaxでviewを返す方法 【Laravel5】FormRequestのバリデーション結果をJSON APIで返す 完全な手順!LaravelでAjaxコンテンツをつくる方法 【Laravel】LaravelでAjax(jQuery)を使用する Laravel、Ajaxを用いて動的なコメント閲覧画面の作成 LaravelでAjaxを使う方法。サーバにPOSTしてResponseを返す
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PHP クラスについて ::parent

::parentは親クラスのプロパティやメソッドにアクセス出来る。 clsass ko extecds oya{} で継承した親の記述にアクセス可能 例) <?php class oya { public function __construct(){ echo '親です'."\n"; } public function oya_func(){ echo '親の関数です'."\n"; } } $oya = new oya(); $oya->oya_func(); //結果 // 親です // 親の関数です class ko extends oya { public function __construct() { echo '子です'."\n"; parent::__construct(); } public function ko_func(){ echo '子供の関数です'."\n"; parent::oya_func(); } } $ko = new ko(); $ko->ko_func(); //結果 // 親です // 親の関数です // 子です // 親です // 子供の関数です // 親の関数です 上記では子供クラスのコンストラクタと関数にそれぞれ「::parent」を設定している。 これにより子供クラスでコンストラクタと関数がそれぞれ呼び出されると親クラスのメソッドが呼び出されている。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

php $this使い方 cakephpなどフレームワークを使う為の基礎知識

$thisの基本 $this->hoge;とすることでそのクラス内のプロパティやメソッドへアクセスをする。 例) <?php class like { private $name =''; public function setName($name) { $this->name = $name; } // この記述では「Unexpected 'Name'.」というエラーが出る。$this->nameとしないと関数外で定義の$nameにアクセス出来ない。 // public function getName(){ // return $name; // } public function getName(){ return $this->name; } } $like = new Like(); $like->setName('甘いもの'); echo $like->getName(); 結果 //甘いもの 上記ではコメントアウトした関数getNameを使用しても$nameを取得出来ない。 関数内で$nameを定義した場合は可能だが、今回はメソッド$nameにアクセスしたい。 その為$thisを使用したアクセス方法で$nameにセットされた「甘いもの」を取得している。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む