بایگانی برچسب: s

ساختن توابع Helper در لاراول

نوشته‌شده در توسط .

هلپر در لاراول به توابعی گفته میشن که همه جای پروژه بهشون دسترسی داریم بدون اینکه هر بار لودشون کنیم.

لاراول کلی هلپر خوب بصورت آماده داره که خیلی از کارهارو براتون آسون میکنه، مثل کار با آرایه ها، فایل ها، رشته ها، روت ها و یکی از پر کاربرترینشون هم همین dd  خودمون :). شما میتونید هلپر های خودتون رو بصورت دستی هم تعریف کنید و با کمپوزر بصورت خودکار لودشون کنید.

نحوه ساختن فایل Helper در لاراول

همونطور که گفتم هلپر ها تابع هستند پس باید داخل یه فایل نوشته بشن. لاراول هیچ دایرکتوری خاصی برای helper ها در نظر نگرفته و شما میتونید بصورت دلخواه براش جا در نظر بگیرید. من مثلا داخل app/Http/Helpers  رو برای این کار در نظر میگیرم و داخلش فایل main.php  رو قرار میدم.

لود خودکار فایل ها در لاراول با کمپوزر

یکی از کاربردهای باحال کمپوزر جدا از مدیریت نیازمندی ها، همین autoload هست که به شما این امکان رو میده که در ران تایم فایل های دلخواهتون رو توی کدتون لود کنید بدون اینکه اون بالا بنویسید require_once any.php . در پروژه لاراولتون یه فایل دارید به اسم composer.json ، توی این فایل یه key به اسم autoload وجود داره و داخلش میتونید مشخص کنید که چه فایل هایی به autoload اضافه بشن. یه مثال واستون میزنم که کاملا بدونید چی به چیه :

به کمپوزر گفتم که فایل main.php  رو بذار توی autoload. حالا باید به کامپوزر بگیم که فایل های autoload رو از اول بسازه، برای این کار توی روت پروژه این کامند رو اجرا کنید :

حالا main.php  و فانکشن هایی که داخلش تعریف میکنید همیشه در دسترس خواهند بود.

تعریف توابع helper در لاراول

توابع هلپر مثل بقیه توابع هستند فقط باید حواسمون باشه که تابع دیگه ای رو رونوشت نکنیم :

هلپر ها خیلی(خیلی خیلی) جاها به دردتون میخورن ولی حواستون باشه که هر چی که لازم بود رو نذارید توی هلپر و فقط توابعی که خیلی ازشون استفاده میکنید رو بذارید داخلش و لذت ببرید.

 

موفق باشید 🙂

ساخت custom notification channel در لاراول

نوشته‌شده در توسط .

لاراول برای ارسال نوتیفیکیشن درایور های متنوعی داره که برای کاراتون میتونید ازش استفاده کنید… ولی بعضی وقتا پیش میاد که نیاز دارید چنل خودتون رو داشته باشید، برای این کار باید کانال ارسال خودتون رو بنویسید که خیلی راحته

مثلا در مسیر app  یک فولدر با عنوان channels  بسازید و توش یه کلاس php با اسم دلخواهتون ایجاد کنید. من اسمشو میذارم SmsChannel .

در قسمت do your action عملیاتی که برای ارسال نوتیفیکیشنتون(!) رو که میتونه متنوع باشه رو انجام بدید… مثلا اگه میخواید با استفاده از یه سرویس دهنده خاص اس ام اس ارسال کنید میتونید کلاسهای اون رو ایمپورت کنید و اس ام اس رو ارسال کنید.

مثلا برای ارسال پیامک بصورت زیر عمل کنید :

که آرایه message  از متد های کلاس های نوتیفیکیشن ها ارسال میشه…

برای ارسال نوتیفیکیشن در متد via  در کلاس نوتیفیکیشن  \App\Channels\SmsChannel::class  رو برگردونید… یه چیزی مثل این :

که میتونید از $notifiable  استفاده کنید و ببینید که اس ام اس واسه کاربر ارسال بشه یا نه… مثلا اعتبار کاربریش اجازه ارسال رو میده یا نه.

و متد زیر رو برای ارسال پیام در کلاس مربوط به نوتیفیکیشن بنویسید :

 

کارکردن با pivot table ها یا جداول محور در laravel

نوشته‌شده در توسط .

مجددا باید بگم که من همه کارام رو توی لاراول ۵٫۰٫۰ انجام میدم 🙂

امروز میخوام در مورد یک چیز خیلی مهم توی لاراول صحبت کنم… نحوه ی ارتباط برقرار کردن چند به چند بین دو جدول در لاراول ۵٫

یک مثال کاملا واقعی در مورد رابطه های چند به چند در لاراول

توی داکیومنت رسمی لاراول مثالی که واسه روابط چند به چند اومده ، رابطه ی role و user هست که یک یوزر میتونه متعلق به چند نقش باشه و برعکس ، یعنی یک نقش مثل ادمین هم میتونه متعلق به چند کاربر باشه . من یه مثال ملموس تر براتون میزنم : رابطه ی محصولات و فروشگاهها رو در نظر بگیرید. شما نیاز دارید که بدونید مثلا گوشی فلان رو چه فروشگاههایی دارن و همچنین نیاز دارید بدونید که فلان فروشگاه چه گوشیهایی داره…

جدول های مورد نظر میتونن به شکل زیر باشن :

shops
– id
– name

products
– id
– name

product_shop
– product_id
– shop_id

برای اینکه بین ذو جدول رابطه چند به چند بوجود بیاد ، بهترین راه استفاده از یک جدول میانی هست که ارتباط بین دو جدول رو تشکیل بده. این جدول حداقل باید دو فیلد داشته باشه ، که آیدی دو ریکورد از دو جدول رو به هم نسبت بده…

برای اینکه این جدول رو درست کنیم میتونیم از مایگریشن های خود لاراول استفاده کنیم… مثلا در یک وبلاگ ، پست ها و تگ ها دارای رابطه چند به چند هستند که جدول post_tag رو میتونیم به صورت زیر بسازیم :

 

جدول  post_tag  رو اصطلاحا بهش میگن pivot table… نام جدول pivot باید بصورت First_Second باشه که First نام جدول اول و Second نام جدول دوم هست… ترتیب هم باید بر اساس حروف الفبا باشه…  بصورت پیشفرض جدول pivot دوتا فیلد داره : post_id و tag_id که میتونید فیلد های بیشتری هم بهش اضافه کنید . مثلا برای اینکه شما یک پلن رو به یک کاربر اختصاص بدید میتونید تاریخ پایان پلن رو هم توی جدول میانی یا همون pivot ذخیره کنید. برای بدست آوردن مقدار فیلد های دیگه هم میتونید از این روش استفاده کنید :

 

مفهموم و کاربرد Facade در لاراول

نوشته‌شده در توسط .
آموزش لاراول

با سلام مجدد ، حتما اگه با لاراول کار کرده باشید ، بارها اسم facade به گوشتون خورده. اما facade واقعا چیه؟ طبق گفته ی سایت خود لاراول ” فساد یک ظاهر استاتیک رو برای کلاسهایی که در کانتینر وجود دارن ایجاد میکنه” در مورد IOC container قبلا توی این پست صحبت کردم . حتما در مورد کلاسهای استاتیک هم اطلاع دارید دیگه و قبلا در این باره هم اینجا حرف زدم…

لاراول خودش کلی فساد! داره که شما بدون اینکه شاید متوجه بشید دارید ازشون استفاده میکنید. مثلا همین Session یا Form و… که استفاده میکنید همگی فساد هستند… لیست کامل فسادهای لاراول رو میتونید اینجا ببینید. از اونجایی که من خودم با لاراول ۵ کار میکنم لینک هایی که به داکیومنت لاراول میدم هم به ورژن ۵ هست و شما میتونید اون بالا سمت راست ، روی ورژن دلخواهتون سوئیچ کنید که البته توی این مورد تفاوت خاصی ندارن… شما میتونید توی لاراول فساد دلخواهتون رو تعریف و استفاده کنید و بعضی جاها کارتون رو خیلی جلو میندازه و البته نشان از حرفه ای بودن شما هم هست این کار… قبل از اینکه بپردازید به ساخت فساد برید و در مورد کانتینر لاراول اطلاعات کامل رو بدست بیارید.

ساخت یک فساد – facade دلخواه در لاراول

هر فسادی که شما میسازید توی لاراول ، باید از کلاس پایه ی Facade  مشتق شده باشن و حتما باید متد  getFacadeAccessor  رو ایمپلیمنت کنید ، توی این متد شما به لاراول میگید که وقتی این فساد رو صدا زدم ، کدوم کلاس که توی کانتینر هست رو لود کنه… کلاس پایه ی Facade  از متد جادویی  __callStatic()  برای این کار استفاده میکنه. بعد از ساخت یک فساد به راحتی میتونید به روش زیر به فساد متد مورد نظرتون دسترسی پیدا کنید :

برای ساخت یک فساد سه تا کار رو باید انجام بدید :

اولین کاری که باید بکنید اینه که کلاس مورد نظرتون رو توی سرویس کانتینر بایند کنید . همونطور که گفتم قبلا در مورد این موضوع مطلبی نوشتم و میتونید توی خود داکیومنت لاراول هم در بارش بخونید . فرض کنید که یه کلاس مثل کلاس زیر رو داریم و میخوایم بصورت استاتیک و فسادگونه! ازش استفاده کنیم :

قدم اول این بود که این کلاس رو در کانتینر بایند کنیم ، بصورت زیر :

بهترین جا هم برای این کار همونطور که میدونید متد register  یک service provider هست که من اسمش رو میذارم PaymentServiceProvider .

قدم دوم : حالا میتونید کلاس فسادتون رو بسازید

قدم سوم

اینه که فساد رو به لاراول معرفی کنید ، برای این کار باید توی config/app.php  یک نام اختصاری برای فساد خودتون بذارید :

حالا به راحتی میتونید به روش آشنای زیر به متد های کلاستون دسترسی داشته باشید :

در نهایت لیست کلی فساد های لاراول که از لارابوک کپی کردم 🙂

فاساد نام سرویس مشخصه سرویس
App Illuminate\Foundation\Application app
Artisan Illuminate\Console\Application artisan
Auth Illuminate\Auth\AuthManager auth
Auth (Instance) Illuminate\Auth\Guard
Blade Illuminate\View\Compilers\BladeCompiler blade.compiler
Bus Illuminate\Contracts\Bus\Dispatcher
Cache Illuminate\Cache\CacheManager cache
Config Illuminate\Config\Repository config
Cookie Illuminate\Cookie\CookieJar cookie
Crypt Illuminate\Encryption\Encrypter encrypter
DB Illuminate\Database\DatabaseManager db
DB (Instance) Illuminate\Database\Connection
Event Illuminate\Events\Dispatcher events
File Illuminate\Filesystem\Filesystem files
Hash Illuminate\Contracts\Hashing\Hasher hash
Input Illuminate\Http\Request request
Lang Illuminate\Translation\Translator translator
Log Illuminate\Log\Writer log
Mail Illuminate\Mail\Mailer mailer
Password Illuminate\Auth\Passwords\PasswordBroker auth.password
Queue Illuminate\Queue\QueueManager queue
Queue (Instance) Illuminate\Queue\QueueInterface
Queue (Base Class) Illuminate\Queue\Queue
Redirect Illuminate\Routing\Redirector redirect
Redis Illuminate\Redis\Database redis
Request Illuminate\Http\Request request
Response Illuminate\Contracts\Routing\ResponseFactory
Route Illuminate\Routing\Router router
Schema Illuminate\Database\Schema\Blueprint
Session Illuminate\Session\SessionManager session
Session (Instance) Illuminate\Session\Store
Storage Illuminate\Contracts\Filesystem\Factory filesystem
URL Illuminate\Routing\UrlGenerator url
Validator Illuminate\Validation\Factory validator
Validator (Instance) Illuminate\Validation\Validator
View Illuminate\View\Factory view
View (Instance) Illuminate\View\View

 

موفق باشید 🙂

حذف کلید خارجی در لاراول

نوشته‌شده در توسط .

همونطور که میدونید اگه یه کلید خارجی توی مایگریشن ها و متد up()  اضافه کنیم ، باید اون رو توی متد down()  حذفش کنیم و یا به اصطلاح drop کنیم. روابط رو میتونید در phpmyadmin->structure->Relation view  ببینید . برای حذف این روابط داکیومنت خود لاراول گفته این کار رو بکنید :

To drop a foreign key, you may use the dropForeign method. Foreign key constraints use the same naming convention as indexes. So, we will concatenate the table name and the columns in the constraint then suffix the name with “_foreign”:

 

یک راه دیگه که توی داکیومنت لاراول گفته نشده اینه :

 

کار با بیش از یک دیتابیس در لاراول ۵

نوشته‌شده در توسط .

بعضی وقتا نیازه که شما با بیش از یک دیتابیس در ارتباط باشید در لاراول ، مثلا ممکنه برای هر وبلاگی که توی سیستم وبلاگ دهی شما ایجاد میشه یک دیتابیس درست کنید(البته فک نکنم تو این مورد ، این کار معقول باشه) اونجا نیاز هست که در اولین قدم توی فایل  config/database.php  کانکشن مربوط به این کار رو ایجاد کنید. بصورت پیشفرض ۴ کانکشن در لاراول ۵ تعریف شده که میتونید شما هم کانکشن دیگه ای برای استفاده تعریف کنید.

تعریف کانکشن برای اتصال به بیش از یک دیتابیس

توی کد بالا ما کانکشن mysql2  رو تعریف کردیم. دقت داشته باشید که کد بالا باید درون connectios تعریف کنید. همچنین توی ریشه اصلی پروژه و توی فایل .env  هم کانکشن باید مشخص شه… اون فایل رو ادیت کنید و مقادیر دلخواهتون رو اضافه کنید :

حالا کانکشن های شما آماده هستند و میتونید به روشی که در ادامه میگم از اونها استفاده کنید.

تغییر کانکشن پیشفرض در لاراول

برای اینکه در کل پروژه کانکشن پیشفرض رو تغییر بدیم ، در فایل  config/database.php  مقدار  'default' => 'mysql',  رو به  'default' => 'mysql2',  تغییر میدیم. در این صورت در کل پروژه شما mysql2 بعنوان کانکشن دیفالت استفاده خواهد شد.

استفاده از یک کانکشن در یک مدل خاص

اما گاهی لازمه که در یک مدل از یک کانکشن خاص استفاده بشه ، برای انجام این کار به روش زیر عمل میکنیم :

از این پس تمام اتصالاتی که با مدل بالا به دیتابیس وصل میشه با کانکشن mysql2 خواهد بود.

تغییر کانکشن در کنترلر

شاید بخواید جزئی تر شید و بخواید درون یک کنترلر خاص کانکشن رو عوض کنید . برای اینکار به راحتی از روش زیر اشتفاده کنید :

همونطور که میبینید با استفاده از متد  setConnection()  این کار شدنیه…

و استفاده در Query Builder :

برای استفاده از کانکشن دیگه توی کوئوری بیلدر هم بصورت زیر عمل میکنیم :

همونطور که میبینید لاراول بصورت خیلی شیک و تمیز کار شما رو راه میندازه و نیاز به اضافه کاری نیست.

امیدوارم به دردتون خورده باشم 🙂

آموزش و کاربرد استفاده IOC container در Laravel – قسمت ۱

نوشته‌شده در توسط .

امروز بحث رو اندکی تخصصی تر میکنیم و میریم سمت container قدرتمند لاراول. یکی از مشخصه هایی که لاراول رو از سایر فریمورک های PHP جدا میکنه ، همین IOC هست. Dependency injection  یا DI یا تزریق نیازمندیها یک موضوع مهم در همه زبانهای شئ گراست. اینکه شما سایر کلاسها رو در کلاس خودتون استفاده کنید خیلی مهمه… 

اما IOC کانتینر چیست؟

برای اینکه از یک کلاس در کدمون استفاده کنیم باید از اون نمونه بگیریم. یه چیزی مثل کد زیر :

 

حتما بارها شده که مقدار  Request $request  رو بعنوان ورودی به یک تابع در کنترلر میفرستید . سوالی که پیش میاد اینه که بدون نمونه گرفتن از کلاس Request چطور php اونو میشناسه؟ اینجاست که کاربرد IOC مشخص میشه. لاراول با کانتینرش شرایطی رو مهیا کرده که شما به راحتی با آبجکت ها کار کنید… لاراول وقتی کدی مثل FOO $foo  رو میبینه دنبال کلاس FOO میگرده که از اون نمونه بگیره. این خیلی خوبه. شما بدون اینکه از کلاس نمونه بگیرید نمونه گرفته میشه. بعضی وقتا پیش میاد که شما میخواید یک ریپازیتوری بنویسید که دیگران هم بتونن ازش استفاده کنن. اینجا نیاز هست که کلاس خودتون رو به لاراول برای نمونه گیری معرفی کنید و شما باید بصورت دستی کلاس رو به IOC بچسبونید یا به اصطلاح bind کنید.

نحوه ی bind یک کلاس به IOC در لاراول

در کد بالا EloquentUserRepository رو چسبوندیم به کانتینر و از این به بعد لاراول کلاس EloquentUserRepository رو میشناسه همه جا.

برای اطلاعات بیشتر کتاب Laravel: From Apprentice To Artisan رو که نوشته تیلور آتول -سازنده لاراول – هست رو بخونید