سرمایه گذاری متفاوت در سال نو 🍎🌱 ۳۵٪ تخفیف نوروزی ➕ حضور رایگان در مسترمایند نخبگان صنعت نرم‌افزار 💻✅
۰ ثانیه
۰ دقیقه
۰ ساعت
۵ میثم
مشکل فراخوانی پراپرتی در تابع‌های بدون نام
جامعه پی اچ پی ایجاد شده در ۲۳ آبان ۱۳۹۹

سلام 

سوال من مربوط به این جلسه نیست اما جای بهتری هم پیدا نکردم!

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

کد صفحه web (جایی که روت‌ها رو مینویسیم) : 

use system\Routing\Web\Route;
Route::prefix('admin')->group(function (){
    Route::get('/','HomeController@index');
    Route::any('/any','HomeController@any');
});

 اینجا زمانی که prefix رو میزارم و مقدار بهش میدم به این شکل بعد اون group رو صدا میزنم و داخل کالبک اون متود get رو صدا میکنم و یا هر متد دیگه prefix رو null بر میگردونه اما اگر به صورت زیر بدم مقدار prefix رو بهم میده  : 

Route::prefix('admin')->get('/','HomeController@index');

چرا این اتفاق میفته در ادامه بقیه کد‌ها رو هم میزارم : 

کد کلاس Route : 

<?php
namespace system\Routing\Web;
use system\Routing\Web\Traits\HasMethodCaller;
use system\Routing\Web\Traits\Tools;
class Route
{
   use Tools,HasMethodCaller;
    protected $prefix;
}

تریت HasMethodCaller : 

<?php
namespace system\Routing\Web\Traits;
trait HasMethodCaller
{
    public static function __callStatic($name, $arguments)
    {
        $class = get_called_class();
        $instance = new $class();
        return $instance->methodCaller($instance,$name,$arguments);
    }
    public function __call($name, $arguments)
    {
        return $this->methodCaller($this,$name,$arguments);
    }
    protected function methodCaller($object,$methodName,$args)
    {
        $name=$methodName."Method";
        return call_user_func_array([$object,$name],$args);
    }
}

تریت Tools :

<?php
namespace system\Routing\Web\Traits;
trait Tools
{
    /**
     * @param callable $callback
     * @return $this
     */
    protected function groupMethod(callable $callback)
    {
        $callback();
        return $this;
    }
    /**
     * @param string $prefix
     * @return $this
     */
    protected function prefixMethod(string $prefix)
    {
        $this->prefix = $prefix;
        return $this;
    }
    /**
     * @param string $route
     * @param string $actions
     */
    protected function getMethod(string $route, string $actions)
    {
        $r = $this->prefix."\".$actions;
        d($r);
        return $this;
    }
    /**
     * @param string $route
     * @param string $actions
     * @return $this
     */
    protected function postMethod(string $route, string $actions)
    {
        d($route,$actions);
        return $this;
    }
    /**
     * @param string $route
     * @param string $actions
     * @return $this
     */
    protected function putMethod(string $route, string $actions)
    {
        d($route,$actions);
        return $this;
    }
    /**
     * @param string $route
     * @param string $actions
     * @return $this
     */
    protected function patchMethod(string $route, string $actions)
    {
        d($route,$actions);
        return $this;
    }
    /**
     * @param string $route
     * @param string $actions
     * @return $this
     */
    protected function deleteMethod(string $route, string $actions)
    {
        d($route,$actions);
        return $this;
    }
    /**
     * @param string $route
     * @param string $actions
     * @return $this
     */
    protected function anyMethod(string $route, string $actions)
    {
        d($this->prefix,$route,$actions);
        return $this;
    }
}

چطوری میتونم به این شکل مقدار پراپرتی prefix رو در همه جا داشته باشم ؟‌

سلام و احترام

یه چیزیو من متوجه نشدم. وقتی از prefix استفاده میکنی route‌های داخلی null برمیگردونن یا خود route group؟

امیر صالحی ۲۳ آبان ۱۳۹۹، ۱۹:۱۹

امیر جان 

تا اون جا که با دامپ گرفتن متوجه شدم زمانی که ما کلاس Route رو فراخوانی میکنیم و متود prefix رو صدا میزنیم ازش مشکلی نداره و مقدار prefix رومیده یعنی به این شکل :‌

Route::prefix('admin')->get('/','HomeController@index');

اما مشکل از جایی شروع میشه که بصورت گروه قراره هر روت رو تعریف کنم و prefix رو یک بار قبل از متد group صدا بزنم و ست کنم توی روت هایی که تو کالبک متود group ایجاد شدن دیگه prefix در دسترس نیست به این شکل 

use system\Routing\Web\Route;
Route::prefix('admin')->group(function (){
    Route::get('/','HomeController@index');
    Route::any('/any','HomeController@any');
});

درواقع پراپرتی‌های کلاس route زمانی که توی کالبک متود group روتی رو میسازم دیگه مقداری که از قبل ست کرده باشم در دسترس نیست. 

میثم ۲۳ آبان ۱۳۹۹، ۲۰:۱۹

میثم جان، توی trail tools تابع groupMethod وقتی Callable فراخوانی میشه در ادامش this$ برگشت (return) داده میشه با برنامه از اونجا رد میشه؟

میخوای بعد از callable توی متد groupMethod یه چیزی رو var_dump کن ببین اصلا خط بعدش اجرا میشه یا ن؟

امیر صالحی ۲۴ آبان ۱۳۹۹، ۰۶:۴۰

میثم این متد d رو که استفاده میکنی اونو هم کداشو قرار بده.

 

تو تریت tools که شما prefix رو مقدار دهی میکنه از کلمه کلیدی parent استفاده کن که دقیقا اشاره که به پراپرتی پدر تا مشکلی پیش نیاره.

امیر صالحی ۲۴ آبان ۱۳۹۹، ۱۱:۳۶

امیر جان ممنون 

مشکل رو فهمیدم مشکل ایجاد نمونه‌های مختلف بود هر بار کلاس روت فراخوانی میشد نمونه جدید اطلاعاتی که توی پراپرتی میریختم رو پاک میکرد توی نمونه جدید حالا اومدم با دیزاین پترن سینگلتون مشکلم رو حل کردم یکبار نمونه ساختم در صورتی که نمونه وجود داشت همون رو بر میگردونم دیگه دسترسی به مقدار prefix هم وجود داره 

 

میثم ۲۴ آبان ۱۳۹۹، ۱۱:۴۰